如何合并对象?

时间:2015-02-12 09:18:55

标签: javascript angularjs merge javascript-objects extends

例如,从这两个对象:

var object1 = {
  "color": "yellow",
  "size": null,
  "age": 7,
  "weight": null
}

var object2 = {
  "color": "blue",
  "size": 51,
  "age": null
}

我想要这个(object2覆盖object1,但他没有的null属性或属性除外):

{
  "color": "blue",
  "size": 51,
  "age": 7,
  "weight": null
}

3 个答案:

答案 0 :(得分:61)

<强> Copy

var src = { name: 'Apple', price: 5};
var dst= angular.copy(src);
  • 深层复制

Extend

var mergedObject = angular.extend(dst, src1, src2, ...) 
  • 浅拷贝

<强> Merge

var mergedObject = angular.merge(dst, src);
  • 自角度1.4 +
  • 深(递归)复制

如果您不想使用null覆盖,可以使用this


<强> Object.assign()

let movie2 = Object.assign({}, movie1, { episode: 8 });
  • fot Angular 2+(ECMAScript 6)

来源:

答案 1 :(得分:18)

对于角度较新的版本(至少1.4.0),您可以使用angular.merge

  

与extend()不同,merge()以递归方式下降到源对象的对象属性中,执行深层复制。

答案 2 :(得分:3)

使用angualr.extend不会产生请求的结果。 object2.age null值将覆盖object1.age值。

angular.extend(object1,object2)将产生以下结果:

{
    "color" : "blue", 
    "size" : 51, 
    "age" : null,   <=== undesirable result
    "weight" : null
}

使用以下代码跳过空属性

for (var prop in object1) {
    if(object1.hasOwnProperty(prop) && object2.hasOwnProperty(prop) && object2[prop]!=null) {
        object1[prop] = object2[prop];
    }
}

这将产生以下请求的结果

{
    "color" : "blue", 
    "size" : 51, 
    "age" : 7, 
    "weight" : null
}