我有一个看起来像这样的对象数组:
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] 删除。
我来说两句