如何使用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?
答案 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; }