Javascript 从数组的数组(对象的嵌套数组)中删除重复项
我有一个数组,其中包含另一个对象数组。我想删除此数组中的重复项Javascript 从数组的数组(对象的嵌套数组)中删除重复项,javascript,arrays,Javascript,Arrays,我有一个数组,其中包含另一个对象数组。我想删除此数组中的重复项 var arr1 = [{ child: [{name: "google", check: false}, {name: "yahoo", check: false}] }, { child: [{name: "excite", check: false}, {name: "facebook", check: false}] }, { child: [{name: "so
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}
,因为在arr1
中已经有一个同名的check:true
下面是我尝试过的一些东西
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));
要在末尾获得一个数组(我想这就是“merge”的意思),您可以将
.concat
一个数组转换为另一个数组。了解您希望根据arr2
中即将出现的新数据更新arr1
中元素的检查属性,一种可能的方法是首先在新的name
和check
值之间创建一个哈希表。对于这一部分,我们使用。该方法的第二部分包括保存新更新的arr1
元素
var arr1=[
{
子项:[{name:“google”,check:false},{name:“yahoo”,check:false}]
},
{
子项:[{name:“exite”,check:false},{name:“facebook”,check:false}]
},
{
子项:[{name:“something1”,check:false},{name:“something2”,check:false}]
}
];
var arr2=[
{
子项:[{name:“google”,check:true},{name:“yahoo”,check:false}]
},
{
子项:[{name:“exite”,check:false},{name:“facebook”,check:false}]
}
];
let upHashTable=arr2.reduce((acc,{child})=>
{
forEach(({name,check})=>acc[name]=check);
返回acc;
}, {});
log(“具有更新的哈希表:”,upHashTable);
让updated=arr1.map(({child})=>
{
返回{child:child.map(o=>
{
o、 check=upHashTable.hasOwnProperty(o.name)?upHashTable[o.name]:o.check;
返回o;
})};
});
日志(“更新的arr1为:”,已更新)代码>
.as控制台{背景色:黑色!重要;颜色:石灰;}
.作为控制台包装{最大高度:100%!重要;顶部:0;}
请同时添加结果。“合并”是什么意思?@FlashThunder我们并不总能选择我们的数据。即使我们这样做了,也可能有更好的方法来问同样的问题。从arr2中删除{name:“google”,检查:false},因为它已经存在于arr1中,然后合并arr1和arr2。@NinaScholz:我已经更新了最终输出。。。感谢我在更新后所做的工作,您似乎希望使用arr2
中即将出现的新数据更新arr1
的数据。这就是你真正想要的吗?似乎平面图不可用。。。。我应该包括rxjs这样的包吗?@thalapathy It is ESnext,一些浏览器可能还不支持它,但是它只是一个嵌套循环的语法糖,在这种情况下,for(const el of arr1)for(const child of el.child)
在这里也可以工作。谢谢,但输出是包含另一个对象数组的数组。。。而不是对象数组。。。就像下面。。。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}]@Thalapathy抱歉,我错过了那部分,我只是想好好想想。