【问题标题】:Extending object's properties without overwriting them扩展对象的属性而不覆盖它们
【发布时间】:2017-05-22 22:08:44
【问题描述】:

我正在尝试从源对象扩展目标对象中的键/值(使用键/值),但不覆盖目标对象中现有的键/值。含义:

var obj1 = {
  a: 1,
  b: 2
};
var obj2 = {
  b: 4,
  c: 3
};
extend(obj1, obj2);
console.log(obj1); // --> {a: 1, b: 2, c: 3}

有趣的是,我找到了Object.assign(obj1,obj2);,但它覆盖了键/值。

我需要不覆盖它们(如果存在)添加它们(如果不存在)

请使用纯 JavaScript 提供帮助。

【问题讨论】:

    标签: javascript object merge


    【解决方案1】:

    在 JS 中没有这样的内置函数可以为您做到这一点。

    你必须编写自己的逻辑来做到这一点,

    var x = {a:10};
    var y = {a:5, b: 20};
    
    merge(x,y);
    
    function merge(objSrc, objTarget){
     return Object.keys(objTarget).reduce(function(src, prop){
       if(!src.hasOwnProperty(prop)) src[prop] = objTarget[prop];
       return src;
     }, objSrc);
    }
    
    console.log(x); {a:10, b:20}
    

    P.S 上面的代码会对可枚举的自己的属性进行合并,因为Object.keys() 会返回相同的结果。

    【讨论】:

      【解决方案2】:

      只是一个简单的循环。如果您只想要可枚举的自己的属性,那么:

      Object.keys(obj2).forEach(function(key) {
          if (!(key in obj1)) {
              obj1[key] = obj2[key];
          }
      });
      

      如果你想要所有可枚举的属性:

      var key;
      for (key in obj2) {
          if (!(key in obj1)) {
              obj1[key] = obj2[key];
          }
      }
      

      其中的关键(没有双关语)位是 in 运算符,它告诉您一个对象是否具有(它自己的或通过继承的)属性。

      还有Object.prototype.hasOwnProperty,它只会告诉你对象是否有它的自己的(不是继承的)具有给定名称的属性:

      Object.keys(obj2).forEach(function(key) {
          if (!obj1.hasOwnProperty(key)) {
              obj1[key] = obj2[key];
          }
      });
      

      更多:

      【讨论】:

        猜你喜欢
        • 2019-09-03
        • 1970-01-01
        • 2017-11-27
        • 1970-01-01
        • 2019-04-17
        • 1970-01-01
        • 2020-02-22
        • 1970-01-01
        • 2019-12-27
        相关资源
        最近更新 更多