如何合并对象?

40

例如,从这两个对象中:

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

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

我想要这个 (object2 覆盖了 object1 除了那些空属性或者他没有的属性):

{
  "color": "blue",
  "size": 51,
  "age": 7,
  "weight": null
}
3个回答

65

复制

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

Extend:

var mergedObject = angular.extend(dst, src1, src2, ...) 
  • 浅复制

合并:

var mergedObject = angular.merge(dst, src);
  • 自Angular 1.4+版本以来
  • 进行深层(递归)复制

如果您不想用null覆盖,您可以使用这个方法


Object.assign():

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

来源:


使用angular.extend将无法产生所需的结果。object2.age的null值将覆盖object1.age的值。 - Saeed D.
@SaeedD,没错,但已经有一种方法来解决这个问题了。请查看我的更新部分中的链接。 - Beri
值得注意的是:Angular的extend和merge是完全不同的。一个是浅拷贝,另一个是深拷贝。 - DanteTheSmith

18

对于版本更新的 Angular (至少 1.4.0),你可以使用 angular.merge

与 extend() 不同,merge() 会递归进入源对象的属性并执行深层复制。


4

使用angular.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
}

1
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - stanleyxu2005

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接