我正在尝试通过比较对象的键将对象复制到另一个对象。根据我的说法,键可以嵌套在任何对象节点上。我仍然需要通过比较它们的key
将它们复制到另一个对象中。
它们在对象树中任何级别的对象键。
这可能吗?
这是我的尝试:
var extend = function (original, context, key) {
for (key in context)
if (context.hasOwnProperty(key))
if (Object.prototype.toString.call(context[key]) === '[object Object]')
original[key] = extend(original[key] || {}, context[key]);
else
original[key] = context[key];
return original;
};
var firstObject = {
key1 : 'ar',
key2 : 'value2',
address:{
"street" : "D15 Road"
"sub":{"name":"Stockoverflow"}
}
};
var secondObject = {
name:"",
street:"",
key3 : 'value3',
key4 : 'value4'
};
var x = extend(secondObject, firstObject )
console.log( 'extend', x );
在我上面的尝试中,street:"",
name:""
仍未更新。
答案 0 :(得分:1)
这应该可以解决问题:
const source = {
key1: 'a',
common1: 'value1',
a: {
b: {
c: {
common2: 'value2'
}
}
}
};
const dest = {
key2: 'b',
common1: null,
common2: null
};
function extend(dest, source) {
Object.entries(source).forEach(([key, value]) => {
if (typeof value === 'object') {
extend(dest, value);
} else if (dest.hasOwnProperty(key)) {
dest[key] = value;
}
});
}
extend(dest, source);
console.log(dest);
基本上,遍历它们只有两个选择:它是一个对象或它的键匹配。
如果它是一个对象,我们只需递归调用extend
。如果键匹配,则我们设置值。
如果您希望能够使用对象作为值来执行此操作(即common1
可以是对象而不是原始对象),只需在if
语句中切换两者即可。