使用Javascript合并2组Object + Array

时间:2017-08-15 10:13:27

标签: javascript jquery

我正在尝试合并两组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: '',
});

2 个答案:

答案 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