所以,如附图所示,我有两个对象,addedBack
和Comments
。我想要做的是用addedBack
中的数组注释覆盖Comments
中的注释数组。
我试过了:
const tempVal = Object.assign(addedBack, Comments)

但tempVal
的价值仅包含addedBack
,而未将Comments
合并到其中。
我该怎么做?
答案 0 :(得分:1)
你的方法应该有效:
var addedBack = { comments: ['that sucks', 'terrible', '0 stars', "It doesn't matter--we'll all still die in the end"]};
var Comments = { comments: ['fantastic', '5 stars', 'I love you', 'A stunning achievement']};
console.log(addedBack.comments); // <= ["that sucks", "terrible", "0 stars", "It doesn't matter--we'll all still die in the end"]
Object.assign(addedBack, Comments); // Could also just do "addedBack.comments = Comments.comments;" if you only care about this one property
console.log(addedBack.comments); // <= ["fantastic", "5 stars", "I love you", "A stunning achievement"]
// Changing Comments.comments also changes addedBack.comments
Comments.comments[0] = 'If I had a tomato, you would be covered in ketchup right now.';
console.log(addedBack.comments); // <= ["If I had a tomato, you would be covered in ketchup right now.", "5 stars", "I love you", "A stunning achievement"]
但请注意,Object.assign会生成对象属性的浅表副本。 Comments.comments是对数组的引用,该引用被复制到addedBack.comments。在Object.assign之后,则Comments.comments和addedBack.comments都引用相同的数组。因此,如果您更改Comments.comments,您还将更改addedBack.comments,如上例所示。如果这种行为对您有用,那么您最好的选择可能是:
addedBack.comments = Comments.comments.slice();
而不是Object.assign
。数组上的slice()将返回数组的副本。
答案 1 :(得分:0)
由于这是一个简单的数据结构(数组),你可以这样做:
addedBack.comments = JSON.parse(JSON.stringify(Comments.comments));
这可能不适用于所有情况,但它可以在这里制作浅表副本。
这是关于克隆的另一个好stackoverflow thread。
答案 2 :(得分:0)
这是另一个适合你的。
如果使用Object.assign,它将返回一个对象,其中第一个对象的属性被第二个对象覆盖。
let obj1 = { x : [ '1', '2', '3' ] };
let obj2 = { x : [ 'a', 'b', 'c' ] };
let obj3 = Object.assign ( obj1, obj2 );
第三个对象将包含:
{ x : [ 'a', 'b', 'c' ] }
这是有意义的:“将obj2的属性/值分配给obj1”。就像你手动完成它一样,它只会覆盖现有的prop / val。
这也有保留原件完好无损的好处,比方说,如果你想测试的属性实际上与原版或其他一些不同。
我的意思是......测试! (哇看我现在有更多的可信度)。
(Object.assign没有被破坏)。
答案 3 :(得分:0)
最终解决方案是import update from 'immutability-helper'
。