我正在尝试合并两组Object&数组如下
{
exclude: ['placeholder'],
attributes: { MYID : '' }
map: 'input'
}
和
{
exclude: ['options'],
attributes: { class: '', id:'', name:'', },
map: '',
}
我尝试使用jQuery的$.extend
函数,但只能合并对象。
并尝试使用lodash js,这也不起作用。
我输出为
{
exclude: ['options'],
attributes: { class: '', id: '', name: '', MYID: '' },
map: '',
}
我需要输出
{
exclude: ['options','placeholder'],
attributes: { class: '', id: '', name: '', MYID: '' },
map: '',
}
代码我尝试使用
$.extend(true,{
exclude: ['placeholder'],
attributes: { MYID : '' }
map: 'input'
},{
exclude: ['options'],
attributes: { class: '', id:'', name:'', },
map: '',
});
答案 0 :(得分:2)
您可以使用for...in
循环为此创建自定义函数,并检查每个值的类型。
var obj1 = {
exclude: ['placeholder'],
attributes: { MYID : '' },
map: 'input'
}
var obj2 = {
exclude: ['options'],
attributes: { class: '', id:'', name:'', },
map: '',
}
function merge(o1, o2) {
for (var i in o2) {
if (o1[i]) {
if (typeof o2[i] == 'object') {
if (Array.isArray(o2[i])) o1[i].push(...o2[i])
else o1[i] = Object.assign({}, o1[i], o2[i])
} else {
o1[i] = o2[i]
}
} else {
o1[i] = o2[i]
}
}
return o1;
}
console.log(merge(obj1, obj2))

答案 1 :(得分:1)
因为_.extend(...)
会覆盖现有字段而不是填充它。
尝试使用_.mergeWith(,, customizer)和自定义程序功能,该功能负责按需要合并字段,例如:
function customizer(initialObject, source) {
if (_.isArray(initialObject)) {
return initialObject.concat(source);
} else if (_.isObject(initialObject)) {
return _.extend(initialObject, source);
} else {
return source;
}
}
_.mergeWith({a: [1], b: {c: 4}}, {a: [2, 3], b: {d: 5}}, customizer);
//{a: Array(3), b: {…}}
//a
//:
//(3) [1, 2, 3]
//b
//:
//{c: 4, d: 5}
//__proto__
//:
//Object