使用Object.assign将对象数组与对象合并

时间:2016-11-04 10:05:34

标签: ecmascript-6

我正在尝试使用Object.assign()

合并对象数组
var state = {
    items: [{
       id: "Harko",
       name: "Haris"
    },
    {
      id: "Benko",
      name: "Benjo"
    }]

}

var a = {
    id: "Benko",
    name: "Bengalka"
}

我已经尝试过了:

Object.assign(state.items,a);
Object.assign({}, { items: [state.items,a]);

我想得的是以下内容:

{
    items: [{
       id: "Harko",
       name: "Haris"
    },
    {
      id: "Benko",
      name: "Bengalka"
    }]
}

所以我希望var的状态中具有id“Benko”的对象被var a覆盖,因为它们具有相同的id。

Object.assign可以实现吗?

任何形式的帮助将不胜感激。

由于

2 个答案:

答案 0 :(得分:5)

您无法使用Object.assign在顶层执行此操作。您需要先做的是find对象引用,然后您可以使用Object.assign来更新它的属性:



const state = {
    items: [{
       id: "Harko",
       name: "Haris"
    },
    {
      id: "Benko",
      name: "Benjo"
    }]

}

const a = {
    id: "Benko",
    name: "Bengalka"
}
const foundObject = state.items.find(obj => obj.id === a.id);
Object.assign(foundObject, a);
console.log(state);




答案 1 :(得分:0)

Lodash merge()适用于我的用例:

let v = {foo: [{change: "first", leave: "here"}]}
_.merge(v, {foo: [{change: "second"}]})

合并后的v值:

{ foo: [{change: "second", leave: "here"}]

与Object.assign()比较,它将第二个替换数组中的第一个项目:

Object.assign(v, {foo: [{change: "second"}]})

之后的v的值(缺少左道具):

{ foo: [{change: "second"}] }