在对象内的对象上使用Object.assign

时间:2018-05-13 17:24:08

标签: javascript object

如何使用Object.assign更新allMsgs数组中的第二个对象?

我有:

let v = {
  allMsgs: [
    {
        a: 111,
        b: [],
    },

    {
        a: 222,
        b: [],
    }
  ]
}

我想要一份v的副本,以便它是:

let v = {
  allMsgs: [
    {
        a: 111,
        b: [],
    },

    {
        a: 222,
        b: ['newItem],
    }
  ]
}

如何使用Object.assign?

3 个答案:

答案 0 :(得分:0)

只需选择要更新的部分

即可



let v = {
  allMsgs: [
    {
        a: 111,
        b: [],
    },

    {
        a: 222,
        b: [],
    }
  ]
};
 let vCopy = { allMsgs: v.allMsgs.map(msg => Object.assign({}, msg))};
vCopy.allMsgs[1] = Object.assign(vCopy.allMsgs[1], { b: ['newItem'] });

console.log('copy', vCopy);
console.log('actual', v);




答案 1 :(得分:0)

如果目标不是改变原始对象,那么你会这样做:



let v = {
  allMsgs: [
    { a: 111, b: [] }, 
    { a: 222, b: [] }
  ]
};

let w = { allMsgs: Object.assign([...v.allMsgs], 
           { 1: Object.assign({}, v.allMsgs[1], 
               {b: ['newItem']} 
           )}
        )};

console.log('updated =', w);
console.log('original =', v);




请注意,allMsgs中的第一个对象仍在两个对象之间共享。只有你想改变的那个(显然)是分开的。

像immutable.js这样的库有很好的方法可以使用简洁的语法进行这样的更新。

答案 2 :(得分:0)

如果没有Object.assign,您可以直接处理数组并推送值。



var v = { allMsgs: [{ a: 111, b: [] }, { a: 222, b: [] }] };

v.allMsgs[1].b.push('newItem');

console.log(v);

.as-console-wrapper { max-height: 100% !important; top: 0; }