【问题标题】:Native javascript - merge two arrays of objects本机 javascript - 合并两个对象数组
【发布时间】:2016-09-27 16:39:18
【问题描述】:

我想合并两个数组,例如:

arr1 = [
    ['01/09',1],
    ['02/09',2],
    ['03/09',3],
    ['04/09',4]
];

arr2 = [
    ['01/09',13],
    ['03/09',14],
    ['04/09',15],
    ['05/09',16]
];

我想要这样的输出:

res = [
    ['01/09',1,13],
    ['02/09',2,0],
    ['03/09',3,14],
    ['04/09',4,15],
    ['05/09',0,16]
]

我真的想要一些解决方案!谢谢

【问题讨论】:

标签: javascript


【解决方案1】:

您可以使用组合方法来构建具有参数的空数组并迭代并为匹配的项目构建哈希表。然后应用该值。

function merge(arrays) {
    var hash = Object.create(null),
        merged = [];

    arrays.forEach(function (a, i) {
        a.forEach(function (b) {
            if (!hash[b[0]]) {
                hash[b[0]] = Array.apply(null, { length: arrays.length + 1 }).map(function () { return 0 });
                hash[b[0]][0] = b[0];
                merged.push(hash[b[0]]);
            }
            hash[b[0]][i + 1] = b[1];
        });
    });
    return merged;
}

var arr1 = [['01/09', 1], ['02/09', 2], ['03/09', 3], ['04/09', 4]],
    arr2 = [['01/09', 13], ['03/09', 14], ['04/09', 15], ['05/09', 16]];

console.log(merge([arr1, arr2]));
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 好的!我会测试它并告诉你!
【解决方案2】:

您可以使用Array.find在数组中搜索,然后使用Array.concat合并它们。

Array.find + array.concat

var arr1 = [
  ['01/09', 1],
  ['02/09', 2],
  ['03/09', 3],
  ['04/09', 4]
];

var arr2 = [
  ['01/09', 13],
  ['03/09', 14],
  ['04/09', 15],
  ['05/09', 16]
];

var result = arr1.map(function(a1) {
  var _tmp = arr2.find(x => x[0] === a1[0]) || [];
  return a1.concat(_tmp.splice(1));
});

console.log(result)

不过,我建议您使用以下结构,因为它更具可扩展性。

地图对象

var arr1 = [
  ['01/09', 1],
  ['02/09', 2],
  ['03/09', 3],
  ['04/09', 4]
];

var arr2 = [
  ['01/09', 13],
  ['03/09', 14],
  ['04/09', 15],
  ['05/09', 16]
];
var result = {};
arr1.forEach(function(item) {
  result[item[0]] = item.slice(1) || [];
});

arr2.forEach(function(item) {
  result[item[0]] = result[item[0]] || [];
  result[item[0]] = result[item[0]].concat(item.slice(1))
});

console.log(result)

几个指针,

  • array.concat 将返回合并的字符串,但不会更新变量。所以不要忘记分配它。
  • array.find 存在兼容性问题。请在使用前检查它们。您也可以使用 array.filter 作为替代。

【讨论】:

    【解决方案3】:

    var arr1 = [
      ['01/09', 1],
      ['02/09', 2],
      ['03/09', 3],
      ['04/09', 4]
    ];
    
    var arr2 = [
      ['01/09', 13],
      ['03/09', 14],
      ['04/09', 15],
      ['05/09', 16]
    ];
    
    var arr3 = [
      ['01/09', 130],
      ['03/09', 140],
      ['04/09', 150],
      ['05/09', 160]
    ];
    
    
    function mergeArrays() {
      var resultObj = {},
        resultArray = [];
      var array = Array.prototype.concat.apply([], Array.prototype.slice.call(arguments));
      array.map(function(item) {
        var key = item[0];
        if (!this[key]) {
          this[key] = [];
          this[key].push(key);
        }
        this[key].push(item[1]);
      }, resultObj);
    
      for (var key in resultObj) {
        resultArray.push(resultObj[key]);
    
      }
      return resultArray;
    }
    console.log(mergeArrays(arr1, arr2, arr3));

    【讨论】:

      【解决方案4】:

      您可以使用reduce() 和forEach() 来做到这一点

      var arr1 = [
        ['01/09', 1],
        ['02/09', 2],
        ['03/09', 3],
        ['04/09', 4]
      ];
      var arr2 = [
        ['01/09', 13],
        ['03/09', 14],
        ['04/09', 15],
        ['05/09', 16]
      ];
      
      var obj = {}
      var result = arr1.reduce(function(r, e) {
      
        arr2.forEach(function(el, i) {
          if (!obj[e[0]]) {
            obj[e[0]] = [e[0], 0, 0];
            r.push(obj[e[0]]);
          }
      
          obj[e[0]][1] = e[1];
          if (el[0] == e[0]) {
            obj[e[0]][2] = el[1];
          } else {
            if (!obj[el[0]]) {
              obj[el[0]] = [el[0], 0, el[1]];
              r.push(obj[el[0]]);
            }
          }
        })
      
        return r;
      }, []);
      
      console.log(result)

      【讨论】:

        猜你喜欢
        • 2019-12-02
        • 1970-01-01
        • 2013-01-17
        • 1970-01-01
        • 1970-01-01
        • 2021-03-08
        • 1970-01-01
        • 2019-09-26
        • 1970-01-01
        相关资源
        最近更新 更多