Javascript 合并包含对象数组的对象
我有两个深度嵌套的对象,其中包含数组和数组中的对象。我想合并这些。使用“lodash”它无法识别数组中的对象 我有这个:Javascript 合并包含对象数组的对象,javascript,arrays,object,lodash,Javascript,Arrays,Object,Lodash,我有两个深度嵌套的对象,其中包含数组和数组中的对象。我想合并这些。使用“lodash”它无法识别数组中的对象 我有这个: var defaults = { rooms: [ { name: 'livingroom', color: 'white' }, { name: 'bedroom', color: 'red' } ]
var defaults = {
rooms: [
{
name: 'livingroom',
color: 'white'
},
{
name: 'bedroom',
color: 'red'
}
],
people: {
clothes: [
{
fabric: 'wool',
color: 'black'
},
{
fabric: 'jeans',
color: 'blue'
}
]
}
}
var specific = {
people: {
wigs: [
{
shape: 'trump'
}
]
},
furniture : {
foo: 'bar'
}
}
结果应该如下所示:
var merged = {
rooms: [
{
name: 'livingroom',
color: 'white'
},
{
name: 'bedroom',
color: 'red'
}
],
people: {
clothes: [
{
fabric: 'wool',
color: 'black'
},
{
fabric: 'jeans',
color: 'blue'
}
],
wigs: [
{
shape: 'trump'
}
]
},
furniture : {
foo: 'bar'
}
}
使用lodash
const _ = require('lodash');
console.log(_.merge({}, specific, defaults));
我明白了
这与:
因为我没有一个通用的索引或名称,所以我有点不知所措。通过查看对象或数组,您可以将
特定的
合并到默认值
函数合并(a、b){
Object.keys(b).forEach(k=>{
如果(!(a中的k)){
a[k]=b[k];
返回;
}
if([a,b].every(o=>o[k]&&typeof o[k]=='object'&&&!Array.isArray(o[k])){
合并(a[k],b[k]);
返回;
}
如果(!Array.isArray(a[k])a[k]=[a[k]];
a[k]=a[k].concat(b[k]);
});
返回a;
}
var默认值={rooms:[{name:'livingroom',color:'white'},{name:'卧房',color:'red'}],people:{衣服:[{fabric:'wool',color:'black'},{fabric:'jeans',color:'blue'}},
具体={人:{假发:[{形状:'trump'}]},家具:{foo:'bar'}};
[默认值,特定].减少(合并);
console.log(默认值)代码>
.as console wrapper{max height:100%!important;top:0;}
是否需要保留对象,或者是否可以对对象进行变异?无需保留。变异是好的。Lodash的\uu.merge()
适用于您的案例-。看看浏览器的控制台,奥里德罗里,你说得对。我还是js新手,在console.log()上有(只有)问题:-),但是我喜欢Nina Scholz的答案,因为它不需要lodash。如果我接受她的回答,我希望这没问题:)IIUC,这不会合并数字和字符串之类的基本属性否?它会生成一个数组并推送一个值。哦,你说得对。我认为a[k].push(k)
应该是a[k].push(b[k])
。此外,可能需要对阵列进行单独检查。如果两个对象都有房间
,那么它将成为一个2D数组,因为推送
我认为应该这样做:a[k]=a[k].concat(b[k])代码>谢谢尼娜和阿迪加-漂亮:)
{ people: { wigs: [ [Object] ], clothes: [ [Object], [Object] ] },
furniture: { foo: 'bar' },
rooms:
[ { name: 'livingroom', color: 'white' },
{ name: 'bedroom', color: 'red' } ] }