我有两个js对象
const first = {
obj1: { f11: "v11", f12: "v12" },
obj2: { f21: "v21" }
}
const second = {
obj1: { f11: "new_value" },
obj3: { f: { ff: { fff: "v"} } }
}
如何仅使用object2的叶值更新第一个javascript对象并获取
const first = {
obj1: { f11: "new_value", f12: "v12" },
obj2: { f21: "v21" },
obj3: { f: { ff: { fff: "v"} } }
}
UPD:我尝试了Object.assign
,但结果是
const first = {
obj1: { f11: "new_value" },
obj2: { f21: "v21" },
obj3: { f: { ff: { fff: "v"} } }
}
我松了一些内部字段
答案 0 :(得分:1)
这需要深度合并。 在jquery中,您可以使用 $ .extend。
等效的Javascript是:
const first = {
obj1: { f11: "v11", f12: "v12" },
obj2: { f21: "v21" }
}
const second = {
obj1: { f11: "new_value" },
obj3: { f: { ff: { fff: "v"} } }
}
function extend(){
for(var i=1; i<arguments.length; i++)
for(var key in arguments[i])
if(arguments[i].hasOwnProperty(key)) {
if (typeof arguments[0][key] === 'object'
&& typeof arguments[i][key] === 'object')
extend(arguments[0][key], arguments[i][key]);
else
arguments[0][key] = arguments[i][key];
}
return arguments[0];
}
console.log("Merged object is: " + JSON.stringify(extend(first, second)))
&#13;
答案 1 :(得分:1)
您可以通过检查类型并指定新值来使用递归方法。
function merge(source, target) {
Object.keys(source).forEach(function (key) {
if (!source[key] && typeof source[key] === 'object') {
target[key] = target[key] || (Array.isArray(source[key]) ? [] : {});
return merge(source[key], target[key]);
}
target[key] = source[key];
});
}
const first = { obj1: { f11: "v11", f12: "v12" }, obj2: { f21: "v21" } },
second = { obj1: { f11: "new_value" }, obj3: { f: { ff: { fff: "v"} } } };
merge(second, first);
console.log(first);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;