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()
将返回相同的属性