嘿伙计们我需要创建一个函数,将第二个对象的属性添加到第一个对象。如果第一个对象已经有给定键,则忽略它(它不能覆盖属性值)。它根本不能修改第二个对象。
到目前为止,这是我的代码:
function extend(obj1, obj2) {
if(obj1.keys !== obj2.keys){
obj1 = {
obj2.keys;
}
}
}
var obj1 = {
a: 1,
b: 2
};
var obj2 = {
b: 4,
c: 3
};
extend(obj1, obj2);
console.log(obj1); // --> IT MUST RETURN {a: 1, b: 2, c: 3}
console.log(obj2); // --> IT MUST RETURN {b: 4, c: 3}
知道我做错了什么吗?
答案 0 :(得分:0)
obj2
obj1
上的密钥尚不存在; 2)密钥存在于obj2
本身而不是其原型链上的某个位置obj1
function extend(obj1, obj2) {
for (var prop in obj2) {
if(!obj1.hasOwnProperty(prop) && obj2.hasOwnProperty(prop)) {
obj1[prop] = obj2[prop];
}
}
}
答案 1 :(得分:0)
首先:obj1
和obj2
在表达状态中不会有属性keys
,因此尝试比较它们是不可能的;您if(obj1.keys !== obj2.keys)
实际上在做的是询问undefined !== undefined
。
其次:对象和数组(我认为这是你希望的obj*.keys
)比较不能像我们比较字符串或数字那样进行。
您可能误解了如何使用Object.keys
来比较它们。有关启示,请参阅this documentation。
每个键可以与另一个键进行比较,但是我们无法将一个组中的所有键与一个组中的所有键进行比较。通常,我们会使用某种形式的循环来完成它们。
Object.assign()
在JavaScript中有many ways to loop through objects and arrays,但我们也可以use Object.assign()
to merge objects。
Object.assign()
方法用于将所有可枚举的自有属性的值从一个或多个源对象复制到target
对象。它将返回target
对象。<强>语法强>
Object.assign(target, ...sources)
在下面的示例中,我们不将obj2
合并为obj1
,target
或obj1
变为{a: 1, b: 4, c: 3}
。相反,我们创建一个新的对象文字并将其作为target
提供,然后将其从返回值中分配为obj1
的新值。
obj2
仍未受影响。
var obj1 = {
a: 1,
b: 2
};
var obj2 = {
b: 4,
c: 3
};
obj1 = Object.assign( {}, obj2, obj1 );
console.log( obj1 ); // {a: 1, b: 2, c: 3}
console.log( obj2 ); // {b: 4, c: 3}
&#13;
...
很快(在发布时)看到使用spread in object literals合并的对象将是共同的:
var mergedObj = { ...obj1, ...obj2 };
但是在这个问题的特定情况下,结果可能并不理想。