鉴于
var obj1 = {
a: 'cat'
b: 'dog'
};
var obj2 = {
b: 'dragon'
c: 'cow'
};
如何在不覆盖obj2
的情况下将obj1
的属性添加到obj1
。输出应该像console.log(obj1)
=> {a: 'cat', b: 'dog', c: 'cow'}
和console.log(obj2)
=> {b: 'dragon', c: 'cow'}
答案 0 :(得分:2)
只需先检查它是否存在,是否不添加它!
for (key in obj2) {
if (!obj1[key]) obj1[key] = obj2[key]
}
正如RobG在评论中指出的那样,如果您的值是假的(0,false,undefined,null,''等等),这将不起作用,它将跳过它们。如果你总是使用字符串,就像在你的例子中一样,那就没问题了,但你也可以安全和全面:
for (key in obj2) {
if (!(obj1.hasOwnProperty(key))) {
obj1[key] = obj2[key]
}
}
答案 1 :(得分:1)
解决方案:
obj1 = {...obj2, ...obj1};
此解决方案仅在您知道预期值可能是多少时才有效,例如:你知道它们都是非空字符串。这使用对象扩展语法。您需要确保最后包含obj1
。你可能需要一个像babel这样的转换器,直到所有的浏览器(IE ......)都赶上来。
let obj1 = {
a: 'cat',
b: 'dog'
};
let obj2 = {
b: 'dragon',
c: 'cow'
};
obj1 = {...obj2, ...obj1};
console.log('obj1:', obj1);
console.log('obj2:', obj2);

答案 2 :(得分:0)
要将属性从一个对象复制到另一个对象,请 Object.assign 。但是,如果源上存在同名的属性,它将覆盖目标对象的值。
您可以创建一个 assignSoft 方法,该方法不会覆盖现有属性的值。以下内容基于MDN的Object.assign polyfill。它似乎有点长,因为它尽可能地为 Object.assign 实现了ECMAScript算法。
此外,与内置的 Object.assign 一样,这只是一个"浅"复制,以便不复制对象值,分配引用。
if (typeof Object.assignSoft != 'function') {
Object.assignSoft = function(target, varArgs) { // .length of function is 2
'use strict';
if (target == null) { // TypeError if undefined or null
throw new TypeError('Cannot convert undefined or null to object');
}
var to = Object(target);
for (var index = 1; index < arguments.length; index++) {
var nextSource = arguments[index];
if (nextSource != null) { // Skip over if undefined or null
for (var nextKey in nextSource) {
// Avoid bugs when hasOwnProperty is shadowed
// Don't copy if property exists on target
if (Object.prototype.hasOwnProperty.call(nextSource, nextKey) && !Object.prototype.hasOwnProperty.call(to, nextKey)) {
to[nextKey] = nextSource[nextKey];
}
}
}
}
return to;
};
}
var obj = Object.assignSoft({a:'a',b:'b'},{b:'bb',c:'c'});
console.log(obj); // {a:'a',b: 'b',c:'c'}
&#13;
更紧凑(尽管不那么严格)的版本只需要一个源对象。要添加对多个源的支持,请迭代传入的参数。
if (!Object.assignSoft) {
Object.assignSoft = function(target, source) {
Object.keys(source).forEach(function(key){
if (!target.hasOwnProperty(key)) {
target[key] = source[key];
}
});
return target;
}
}
var obj = Object.assignSoft({a:'a',b:'b'},{b:'bb',c:'c'});
console.log(obj); // {a:'a',b: 'b',c:'c'}
&#13;