【问题标题】: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
}

【问题讨论】:

    标签: javascript angularjs merge javascript-objects extends


    【解决方案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)

    来源:

    【讨论】:

    • 使用 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
      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 2013-04-08
      • 2011-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-19
      • 2019-03-16
      相关资源
      最近更新 更多