【问题标题】:Filtering array of objects by multiple parameters [duplicate]通过多个参数过滤对象数组[重复]
【发布时间】:2021-08-23 15:10:35
【问题描述】:

我有一个如下所示的对象数组:

const arr = [
        {name: "1", category: "TV", region: "US"}
        ,{name: "2", category: "TV", region: "SE"}
        ,{name: "3", category: "Movies", region: "US"}
        ,{name: "4", category: "Music", region: "US"}
        ,{name: "5", category: "Movies", region: "UK"}
        ,{name: "6", category: "Movies", region: "UK"}
        ,{name: "6", category: "Cartoon", region: "SP"}
];

请注意,没有字段是唯一的。如您所见,可以有多个名称:6。然而,对象本身是独一无二的,因为没有一个对象具有与另一个对象完全相同的属性。

我想应用 OR 标准。所以我想要所有至少与其中一个属性匹配的对象。 例如,使用这个带有条件的 json 数组:

const filtrering = [
    { name: 'category', values: [ 'TV', 'Movies' ] }
    ,{ name: 'region', values: [ 'UK' ] }
];   

我希望看到一个包含除数字 4 之外的所有值的数组(其中 category=Music 和 region=US,它们不在条件数组中)。 使用这个三重映射,我得到了正确的对象,但有重复:

filtrering.map(filter => {
    arr.map(ind => {
        filter.values.map(vl => {
           if(ind[filter.name] === vl){
               console.log("index found:",ind);
            }
        });
    });
});    

所以控制台正在记录以下内容:

index found: { name: '1', category: 'TV', region: 'US' }
index found: { name: '2', category: 'TV', region: 'SE' }
index found: { name: '3', category: 'Movies', region: 'US' }
index found: { name: '5', category: 'Movies', region: 'UK' }
index found: { name: '6', category: 'Movies', region: 'UK' }
index found: { name: '5', category: 'Movies', region: 'UK' }
index found: { name: '6', category: 'Movies', region: 'UK' }

也许我可以删除重复项。但在我看来,这似乎不是解决这个问题的最佳算法。

【问题讨论】:

  • 你没有从任何map 调用中返回任何东西,所以它们几乎没用。如果您想过滤数组,请使用filter。

标签: javascript


【解决方案1】:

请找到array.reduce 的相同实现。

const arr = [
  { name: "1", category: "TV", region: "US" },
  { name: "2", category: "TV", region: "SE" },
  { name: "3", category: "Movies", region: "US" },
  { name: "4", category: "Music", region: "US" },
  { name: "5", category: "Movies", region: "UK" },
  { name: "6", category: "Movies", region: "UK" },
  { name: "6", category: "Cartoon", region: "SP" }
];
const filtrering = [
  { name: 'category', values: ['TV', 'Movies'] },
  { name: 'region', values: ['UK'] }
];

const output = arr.reduce((acc, curr) => {
  let isNodeSatisfied = false;
  filtrering.forEach((criteria) => {
    isNodeSatisfied = isNodeSatisfied || criteria.values.indexOf(curr[criteria.name]) > -1;
  })
  if (isNodeSatisfied) {
    acc.push(curr)
  }
  return acc;
}, []);
console.log(output);

【讨论】:

    猜你喜欢
    • 2018-08-09
    • 2019-05-05
    • 2019-08-20
    • 2023-01-02
    • 2021-08-18
    • 1970-01-01
    • 2022-11-27
    • 2021-10-30
    • 2019-07-18
    相关资源
    最近更新 更多