HowTo:使用另一个Object的属性覆盖Object属性

时间:2017-04-28 15:44:35

标签: javascript

所以,如附图所示,我有两个对象,addedBackComments。我想要做的是用addedBack中的数组注释覆盖Comments中的注释数组。

我试过了:



const tempVal = Object.assign(addedBack, Comments)




tempVal的价值仅包含addedBack,而未将Comments合并到其中。

我该怎么做?

enter image description here

4 个答案:

答案 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'