Javascript 合并包含对象数组的对象

Javascript 合并包含对象数组的对象,javascript,arrays,object,lodash,Javascript,Arrays,Object,Lodash,我有两个深度嵌套的对象,其中包含数组和数组中的对象。我想合并这些。使用“lodash”它无法识别数组中的对象 我有这个: var defaults = { rooms: [ { name: 'livingroom', color: 'white' }, { name: 'bedroom', color: 'red' } ]

我有两个深度嵌套的对象,其中包含数组和数组中的对象。我想合并这些。使用“lodash”它无法识别数组中的对象

我有这个:

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' } ] }