在Javascript中合并对象中的嵌套数组

时间:2016-10-13 17:12:00

标签: javascript arrays merge lodash

我需要将2个对象与嵌套数组合并

var dest = {
  id: "865",
  arr: [{
    id: "123",
    value: "First" }]
};

var src = {
  id: "865",
  arr: [{
    id: "456",
    value: "Second" }]

};

生产

merge = {
  id: "865",
  arr: [{id: "123",
         value: "First"},
        {id: "456",
         value: "Second"}]
};

我尝试使用_.merge(dest,src)(使用Lodash)和其他几种方法,但似乎第二个对象覆盖了第一个,因为它没有像我一样处理嵌套数组想。

这样做的最佳方式是什么?

谢谢,

3 个答案:

答案 0 :(得分:0)

您可以使用Object.assign()



var dest = {
  id: "865",
  arr: [{
    id: "123",
    value: "First" }]
};

var src = {
  id: "865",
  arr: [{
    id: "456",
    value: "Second" }]

};

var merge = Object.assign({}, dest);
merge.arr.push(Object.assign({}, src.arr[0]));

src.arr[0].id = 789; // should not affect `merge.arr`

console.log(merge);




答案 1 :(得分:0)

您可以使用Lodash _.mergeWith方法:

var dest = {
  id: "865",
  arr: [{
    id: "123",
    value: "First"
  }]
};

var src = {
  id: "865",
  arr: [{
    id: "456",
    value: "Second"
  }]

};

var merge = _.mergeWith({}, src, dest, function(a, b) {
  if (_.isArray(a)) {
    return b.concat(a);
  }
});
console.log(merge);

它允许您传递自定义程序,以便以“自定义”方式合并数组。

这是fiddle。希望它有所帮助。

答案 2 :(得分:0)

没有任何图书馆。

    var dest = {
      id: "865",
      arr: [{
        id: "123",
        value: "First"
      }]
    };

    var src = {
      id: "865",
      arr: [{
        id: "456",
        value: "Second"
      }]

    };

    // 1
    var resultOne = {
      id: dest.id,
      arr: src.arr.concat(dest.arr)
    };

    // 2
    var resultTwo = Object.assign({}, src, {
      arr: src.arr.concat(dest.arr)
    });


    // 3
    var merge = function(obj1, obj2) {
      return Object.keys(obj1).reduce(function(result, next) {
        if (Array.isArray(obj1[next]) && Array.isArray(obj2[next])) {
          result[next] = obj1[next].concat(obj2[next]);
        } else if (obj1[next] && obj2[next]) {
          result[next] = obj2[next];
        }
        return result;
      }, {});
    }

    console.log(merge(src, dest));