Javascript 如何从数组中删除具有额外键的重复项

Javascript 如何从数组中删除具有额外键的重复项,javascript,arrays,Javascript,Arrays,我有两个阵列: const a1=[ { a:{ name: "first" } }, { b:{ name: "second" } }, { c:{ name: "third" } }, { d:{ name: "fourth" } } ] const a2=[ { a:{ name: "first", shelf: "read" } }, { b:{ name: "second", shelf: "

我有两个阵列:

const a1=[
  {
    a:{ name: "first" }
  },
  {
    b:{ name: "second" }
  },
  {
    c:{ name: "third" }
  },
  {
    d:{ name: "fourth" }
  }
]

const a2=[
  {
    a:{ name: "first", shelf: "read" }
  },
  {
    b:{ name: "second", shelf: "current" }
  }

]
我需要检查a1的内容是否在a2中,如果它存在,则在a1中替换它(基本上a1中缺少工具架名称。我需要在a1中更新该名称)

我的最终结果应该是:

[
  {
    a:{ name: "first", shelf: "read" }
  },
  {
    b:{ name: "second", shelf: "current" }
  }
  {
    c:{ name: "third" }
  },
  {
    d:{ name: "fourth" }
  }
]
我试过类似的东西

const x = a1.map( ele => {
    a2.map( e =>  {
        if( e.name === ele.name ) return ele 
        else return ({ ...ele, shelf: 'none' })
    })
    return ele;
})

但是由于我没有访问内部映射返回值的权限,所以我得到了原始数组。我想到的一种方法是连接两个数组,并通过使用javascript的reduce方法检查shelf名称来使用reduce数组。有人能帮我找到更好的方法吗。

我会先为“a2”创建一个辅助对象,当我在
a1
上循环时,我会在每个循环中检查辅助对象中是否存在当前键

让辅助对象保存不必要的循环,只需遍历两个数组一次

const a1=[{a:{name:“first”},{b:{name:“second”},{c:{name:“third”},{d:{name:“fourth”}];
常量a2=[{a:{name:“first”,shelf:“read”},{b:{name:“second”,shelf:“current”}];
常数dict=a2.reduce((acc,ob)=>{
常数[k,v]=对象项(ob)[0];
acc[k]=v;
返回acc;
}, {});
常数newA1=a1.map((ob)=>{
常数[k,v]=对象项(ob)[0];
if(dict[k]){
赋值(v,dict[k]);
}
返回{[k]:v};
});

console.log(newA1)
这应该以简洁的方式完成工作:

a1.map((it)=> {
    const key = Object.keys(it)[0];
    const a2item = a2.find( (it2) => Object.keys(it2)[0]===key );
    if(a2item) {
        Object.assign(it[key], a2item[key]);
    }
    return it;
});

请注意,原始a1阵列的元素已被修改。

到目前为止,您到底尝试了什么?我们很高兴看到你的尝试。你到底被困在哪里了?@JeremyThille我已经更新了我的问题,但我还没有取得多大进展