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抱歉,我错过了那部分,我只是想好好想想。