扩展对象的属性而不覆盖它们

时间:2017-01-08 15:57:25

标签: 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);,但它覆盖了键/值。

我需要不覆盖它们,如果存在如果不存在则添加

请用简单的JavaScript帮助。

2 个答案:

答案 0 :(得分:0)

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

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];
    }
});

更多:

答案 1 :(得分:0)

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()会返回相同的内容。