【问题标题】:Merge nested array in object in Javascript在Javascript中合并对象中的嵌套数组
【发布时间】:2017-02-22 22:31:39
【问题描述】:

我需要将 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)和其他一些方法,但似乎第二个对象正在覆盖第一个对象,因为它没有按照我想要的方式处理嵌套数组。

最好的方法是什么?

谢谢,

【问题讨论】:

  • dest.arr = _.merge(dest.arr,src.arr)

标签: javascript arrays merge lodash


【解决方案1】:

没有任何库。

    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));

【讨论】:

    【解决方案2】:

    你可以使用 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。希望对您有所帮助。

    【讨论】:

    • 谢谢!这就是我要找的。​​span>
    • @GavinAng 很高兴听到这个消息。如果你没问题,请接受答案,谢谢!
    • 如果我需要根据顶层的 id 字段(即 id=865)进行合并,这将如何改变。我意识到如果 src 和 dest 都是对象数组并且我正在尝试基于 id 合并,则上述方法不起作用。
    【解决方案3】:

    您可以使用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);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多