说我有以下两个对象:
var a = {
"abc": {
"111": {
name: "jon"
}
},
"xyz": {
"222": {
name: "bill"
}
}
}
var b = {
"xyz": {
"333": {
name: "mary"
}
}
}
然后,我想创建一个新对象,以按顶级键名将两者合并。所以要得到这样的东西:
var c = {
"abc": {
"111": {
name: "jon"
}
},
"xyz": {
"222": {
name: "bill"
},
"333": {
name: "mary"
}
}
}
我想可能是您使用.map()
,.each()
或.reduce()
做的事情吗?
jQuery在这种情况下会有所帮助吗?如果可以,怎么办?
答案 0 :(得分:4)
您可以简单地使用Object.entries()和Array.reduce(),
主要思想是遍历两个数组并维护一个映射。
遍历第一个对象并创建其所有属性的映射。
要遍历第二个对象,并对其第二个属性的每个属性检查它是否存在于map中,如果存在,则将其合并,如果不存在,则简单地将其添加。
< / li>
var a = { "abc": { "111": { name: "jon" } }, "xyz": { "222": { name: "bill" } } }
var b = { "xyz": { "333": { name: "mary" } } };
let result = Object.entries(a).reduce((acc,[key, value]) => (acc[key] = value,acc),{});
Object.entries(b).reduce((acc,[key, value]) => (acc[key] =acc[key] && Object.assign(acc[key], value)|| value,acc),result);
console.log(result);
如果您可以使用现有对象之一,则简单的解决方案可能是:
var a = { "abc": { "111": { name: "jon" } }, "xyz": { "222": { name: "bill" } } }
var b = { "xyz": { "333": { name: "mary" } } };
Object.entries(a).forEach(([key, value])=>{
b[key] = Object.assign(b[key] || {}, value);
});
console.log(b);
答案 1 :(得分:2)
如果您已经在项目中使用jQuery或Lodash,则可以分别使用$.extend
或_.merge
。当您已经在使用其中一个库时,无需重新设计轮子。
var a = { "abc": { "111": { name: "jon" } }, "xyz": { "222": { name: "bill" } } };
var b = { "xyz": { "333": { name: "mary" } } };
console.log($.extend(true, {}, a, b));
console.log(_.merge({}, a, b));
console.log("a =", a);
console.log("b =", b);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
答案 2 :(得分:0)
您可以使用es6对象解构吗?
var a = {
"abc": {
"111": {
name: "jon"
}
},
"xyz": {
"222": {
name: "bill"
}
}
}
var b = {
"xyz": {
"333": {
name: "mary"
}
}
}
const c = {abc: a.abc, xyz: [a.xyz, b.xyz]};
console.log(c);