繁体   English   中英

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

[英]How to remove duplicates with extra keys from an array

我有两个 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: "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;
})

但是由于我无法访问内部映射返回值,所以我得到了原始数组。 我这样做的一种方法是连接两个 arrays 并通过使用javascript的reduce方法检查架子名称来使用reduce数组。 有人可以用更好的方法帮助我。

我会 go 首先为“a2”创建一个辅助 object,当我在a1上循环时,在每个循环中我会检查辅助 ZA8CFDE6331BD59EB2666F8911ZC4 中是否存在当前密钥。

拥有辅助 Object 可以为您节省不必要的循环,您只需遍历 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: "current"}}]; const dict = a2.reduce((acc, ob) => { const [k, v] = Object.entries(ob)[0]; acc[k] = v; return acc; }, {}); const newA1 = a1.map((ob) => { const [k, v] = Object.entries(ob)[0]; if (dict[k]) { Object.assign(v, dict[k]); } return {[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 数组的元素被修改了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM