我有一个数组,其中包含另一个对象数组。我想删除这个数组数组中的重复项。
var arr1 = [{
child: [{name: "google", check: false}, {name: "yahoo", check: false}]
},
{
child: [{name: "excite", check: false}, {name: "facebook", check: false}]
},
{
child: [{name: "something1", check: false}, {name: "something2", check: false}]
}
]
var arr2 = [{
child: [{name: "google", check: true}, {name: "yahoo", check: false}]
},
{
child: [{name: "excite", check: false}, {name: "facebook", check: false}]
}
]
var arr3 = [{
child: [{name: "google", check: true}, {name: "yahoo", check: false}]
},
{
child: [{name: "excite", check: false}, {name: "facebook", check: false}]
},
{
child: [{name: "something1", check: false}, {name: "something2", check: false}]
}
]
我想从第二个子数组中删除 {name: "google", check: false}
因为已经有一个具有相同名称和 check: true
在 arr1
中。
下面是我试过的东西。
function mergeAndRemoveDuplicates(arr1, arr2) {
return arr1.map(function(child) {
return child.some(function(children) {
return arr2.map(function(child2) {
return child2.some(function(children2) {
return children.name === children2.name &&
children.check === true;
});
})
})
})
}
console.log(mergeAndRemoveDuplicates(arr1, arr2));
最佳答案
您可以创建一组经过检查的名称并递归地过滤数组:
const dupes = new Set;
for(const el of arr1.concat(arr2))
el.child = el.child.filter(el => {
const dupe = dupes.has(el.name);
if(el.check) dupes.add(el.name);
return !dupe;
});
这也将过滤 arr1
中的重复项,如果不需要,您可以使用 arr1
构建集合,然后过滤 arr2
:
const dupes = new Set;
for(const child of arr1.flatMap(it => it.child))
if(child.checked) dupes.add(child.name);
for(const el of arr2)
el.child = el.child.filter(it => !dupes.has(it.name));
要在末尾获得一个数组(我想这就是您所说的“合并”的意思),您可以.concat
一个到另一个。
关于javascript - 从 Array of Array(嵌套的对象数组)中删除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54984841/