如何合并对象?

Posted

技术标签:

【中文标题】如何合并对象?【英文标题】:How to merge objects? 【发布时间】:2015-04-12 23:00:35 【问题描述】:

例如,从这两个对象:

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

【问题讨论】:

【参考方案1】:

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 );
支持 Angular 2+ (ECMAScript 6)

来源:

https://docs.angularjs.org/api/ng/function

http://davidcai.github.io/blog/posts/copy-vs-extend-vs-merge/

【讨论】:

使用 angualr.extend 不会产生请求的结果。 object2.age null 值将覆盖 object1.age 值。 @SaeedD.true,但已经有办法解决这个问题。检查我在更新部分的链接。 值得注意的是:角度扩展和合并是完全不同的。一浅一深。【参考方案2】:

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

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

【讨论】:

【参考方案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

【讨论】:

我在搜索extendmerge 的区别时发现了讨论。在这种情况下,如果我们有 angular 1.4.x,我们可以使用您的代码或致电 angular.merge

以上是关于如何合并对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何将同一属性上的数组和对象“合并/合并”到平面数组中(使用Javascript)?

如何合并MongoDB中的对象

如何合并两个对象数组

如何合并对象?

如何在java中合并两个复杂对象

如何将两个java对象合并为一个?