我尝试从源对象扩展目标对象中的键/值(使用键/值),但不覆盖目标对象中的现有键/值。含义:
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帮助。
答案 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()
会返回相同的内容。