Javascript 扩展对象';在不覆盖属性的情况下删除属性

Javascript 扩展对象';在不覆盖属性的情况下删除属性,javascript,object,merge,Javascript,Object,Merge,我试图从源对象扩展目标对象中的键/值(使用键/值),但不覆盖目标对象中现有的键/值。意思是: 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),但它会覆盖键/值 我需要不覆盖它们(如果存在)并且添加它们(如果不存在) 请使

我试图从源对象扩展目标对象中的键/值(使用键/值),但不覆盖目标对象中现有的键/值。意思是:

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提供帮助。

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

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];
    }
}
键(无双关)位是
操作符中的
,它告诉您对象是否有属性(自身属性或通过继承)

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

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


    • 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}
      
      上面的代码将对可枚举的自身属性进行合并,因为
      Object.keys()
      将返回相同的属性