【问题标题】:JS/Es6 how to merge two arrays and override values in their objectsJS/Es6 如何合并两个数组并覆盖其对象中的值
【发布时间】:2016-11-12 19:06:23
【问题描述】:

假设我有一个这样的数组

let arrayOne = [{text="one", value=0},{text="two", value=0}]
let arrayTwo = [{text="two", value=5}]

所以arrayOne 将始终是我想要的整个对象集,但所有值都将为 0。arrayTwo 将具有该数组的一个子集,但始终具有一个值集。我想要的如下,如果arrayOne中存在arrayTwo对象,则将值复制到arrayOne对象中。

所以最后我想要

let arrayOne = [{text="one", value=0},{text="two", value=5}]

我做了这样的事情,但我觉得我缺少一些 es6 魔法。

for (let orig of arrayOne) {
                arrayTwo.find(item => {
                    if (item.value == orig.value) {
                        Object.assign(orig, item);
                    }
                })
            }

【问题讨论】:

  • “我觉得我缺少一些 es6 魔法” 不是真的,但这不是 find 的正确用法。回调应返回truefalse,然后.find 将返回匹配值或null。你使用它的方式,你应该使用forEach。此外,迭代 arrayTwo 可能更有意义。
  • @Felix 得到了很好的反馈

标签: javascript ecmascript-6


【解决方案1】:

是的

arrayOne = arrayOne.map(item1 => {
  return Object.assign(item1, arrayTwo.find(item2 => {
    return item1.text === item2.text
  }))
})

【讨论】:

    【解决方案2】:

    我在JavaScript merging objects by id回答了类似的问题

    但是,由于您要更新其中一个初始数组,并且您说另一个是子集,您可以将其改进为

    let arrayOne = [{text:"one", value:0},{text:"two", value:0}]
    let arrayTwo = [{text:"two", value:5}]
    var hash = Object.create(null);
    arrayOne.forEach(obj => hash[obj.text] = obj);
    arrayTwo.forEach(obj => Object.assign(hash[obj.text], obj));
    console.log(arrayOne);

    平均成本只是线性的,O(arrayOne.length) 用于填充哈希,O(arrayTwo.length) 用于分配,假设每个对象的属性很少。

    【讨论】:

      猜你喜欢
      • 2018-05-13
      • 2019-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-07-07
      • 2022-11-02
      • 2014-01-02
      • 2011-11-24
      • 2017-02-04
      相关资源
      最近更新 更多