按多个参数过滤对象数组

奥德弗拉

我有一个看起来像这样的对象数组:

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' }

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

尼泰什

请找到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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章