我可能会误解Object.assign()
的工作原理,但我并不认为它会移除现有的属性,例如:
var o1 = { "status":"", "app":{"version":"1.3.1.91","latest_version":"1.3.1.91"} }
var o2 = { "status":"listening", "app":{"latest_version":"1.3.2.879"} }
console.log(Object.assign({}, o1, o2));
输出:{"status":"listening","app":{"latest_version":"1.3.2.879"}}
我的期望是:{"status":"listening", "app":{"version":"1.3.1.91", "latest_version":"1.3.2.879"}}
我想这是因为它是一个嵌套对象?有没有让它自动更新嵌套对象(即,不必指定哪些)没有任何库?
谢谢
答案 0 :(得分:1)
Object.assign无法管理嵌套对象。您必须遍历对象的属性。
以下代码管理您的案例,但如果您想使用更多嵌套对象,请以递归方式执行此操作
var o1 = { "status":"", "app":{"version":"1.3.1.91","latest_version":"1.3.1.91"} };
var o2 = { "status":"listening", "app":{"latest_version":"1.3.2.879"} };
var output = {};
Object.keys(o2).forEach(key => {
if (o2[key] instanceof Object) {
output[key] = Object.assign({}, o1[key], o2[key]);
} else {
output[key] = o2[key];
}
});
console.log(output);
答案 1 :(得分:1)
目标对象中的属性将被源中的属性覆盖(如果它们具有相同的键)。后来的消息来源'属性将类似地覆盖先前的属性。
Object.assign()方法仅将可枚举和自己的属性从源对象复制到目标对象。它在源上使用[[Get]],在目标上使用[[Set]],因此它将调用getter和setter。因此,它分配属性而不仅仅是复制或定义新属性。
陈述MDN。如果您要使用jQuery,可以通过$.extend()
完成此任务(在api.jquery.com上阅读更多内容):否则,您很可能会写出像@ Faly的答案。< / p>
var o1 = { "status":"", "app":{"version":"1.3.1.91","latest_version":"1.3.1.91"} }
var o2 = { "status":"listening", "app":{"latest_version":"1.3.2.879"} }
console.log($.extend(true, {}, o1, o2));
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
答案 2 :(得分:1)
var o1 = { a: 1, b: 1, c: 1 };
var o2 = { b: 2, c: 2 };
var o3 = { c: 3 };
var obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
如果稍后出现的对象具有相同的属性,Object.assign将覆盖属性。在您的情况下,o2属性正在覆盖o1属性。我不认为有一种方法可以使用Object.assign实现您想要的效果。
答案 3 :(得分:0)
使用Object.assign,对象具有相同的键替换为最后一个对象:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
var o1 = { status:"", app:{"version":"1.3.1.91","latest_version":"1.3.1.91"}};
var o2 = { status:"listening", app:{"latest_version":"1.3.2.879"} };
var {app: appo2} = o2
var {app: appo1} = o1
const result = {
...o2,
app: {
...appo1,
...appo2
}
}
console.log(result);
答案 4 :(得分:0)
另一个选项可以是嵌套分配:
var o1 = { status: "" , app: { "version":"1.3.1.91", "latest_version":"1.3.1.91" } }
var o2 = { status: "listening", app: { "latest_version":"1.3.2.879" } }
var o3 = Object.assign({}, o1, o2, { app: Object.assign(o1.app, o2.app) } )
var o4 = { ...o1, ...o2, app: { ...o1.app, ...o2.app } }
console.log( JSON.stringify(o3) )
console.log( JSON.stringify(o4) )
答案 5 :(得分:0)