JS / Es6如何合并两个数组并覆盖其对象中的值

时间:2016-11-12 19:06:23

标签: javascript ecmascript-6

假设我有一个像这样的数组

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

所以arrayOne将始终是我想要的整个对象集,但所有值都为0. arrayTwo将具有此数组的子集,但始终具有值集。我想要的是,如果arrayTwo中存在arrayOne个对象,则将值复制到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);
                    }
                })
            }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

我在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)用于分配,假设每个对象的属性很少。

相关问题