【问题标题】:Javascript merge 2 arrays and sum same key valuesJavascript合并2个数组并对相同的键值求和
【发布时间】:2013-06-11 11:57:57
【问题描述】:

我有 2 个数组:

    var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]];
    var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]];

想要得到 1 个合并后的数组,对应键的总和;

    var array1 = [[1,10],[2,10],[3,10],[4,10],[5,50],[6,50],[7,10],[8,10],[9,10]];

两个数组都有唯一的键,但是对应的键需要相加。

我尝试了循环、concat 等,但无法得到我需要的结果。

以前有人做过吗?

【问题讨论】:

  • 也许您可以向我们展示您认为最接近预期工作的尝试。

标签: javascript arrays merge sum


【解决方案1】:

您可以使用.reduce() 传递一个跟踪找到的集合并进行添加的对象。

演示: http://jsfiddle.net/aUXLV/

var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]];
var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]];

var result =
    array1.concat(array2)
          .reduce(function(ob, ar) {
              if (!(ar[0] in ob.nums)) {
                  ob.nums[ar[0]] = ar
                  ob.result.push(ar)
              } else
                  ob.nums[ar[0]][1] += ar[1]

              return ob
          }, {nums:{}, result:[]}).result

如果您需要对结果进行排序,则将其添加到末尾:

.sort(function(a,b) {
    return a[0] - b[0];
})

【讨论】:

    【解决方案2】:

    试试这个:

    var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]];
    var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]];
    var res = [];
    
    someReasonableName(array1, res);
    someReasonableName(array2, res);
    
    function someReasonableName(arr, res) {
      var arrLen = arr.length
      , i = 0
      ;
    
      for(i; i < arrLen; i++) {
        var ar = arr[i]
        , index = ar[0]
        , value = ar[1]
    
        ;
    
        if(!res[index]) {
            res[index] = [index, 0];
        }
        res[index][1] += value;
      }
    }
    
    console.log(JSON.stringify(res, null, 2));
    

    所以,结果可能有漏洞。就像0th 索引一样。如果要确保没有孔,请使用以下功能。

    function compact(arr) {
      var i = 0
      , arrLen = arr.length
      , res = []
      ;
      for(i; i < arrLen; i++) {
        var v = arr[i]
        ;
        if(v) {
          res[res.length] = v;
        }
      }
      return res;
    
    }
    

    所以,你可以这样做:

    var holesRemoved = compact(res);
    

    最后,如果您不想要 res0th elem。做res.shift();

    免责声明:我不擅长给出合理的名字。

    【讨论】:

      【解决方案3】:

      这是一种方法:

      var sums = {}; // will keep a map of number => sum
      
      // for each input array (insert as many as you like)
      [array1, array2].forEach(function(array) {
          //for each pair in that array
          array.forEach(function(pair) {
              // increase the appropriate sum
              sums[pair[0]] = pair[1] + (sums[pair[0]] || 0);
          });
      });
      
      // now transform the object sums back into an array of pairs
      var results = [];
      for(var key in sums) {
          results.push([key, sums[key]]);
      }
      

      See it in action.

      【讨论】:

        【解决方案4】:

        可以使用 [].map() 编写一个简短的例程

        var array1 = [[5,10],[6,10],[7,10],[8,10],[9,10]];
        var array2 = [[1,10],[2,10],[3,10],[4,10],[5,40],[6,40]];
        
        array1=array2.concat(array1).map(function(a){
          var v=this[a[0]]=this[a[0]]||[a[0]];
          v[1]=(v[1]||0)+a[1];
         return this;
        },[])[0].slice(1);
        
        alert(JSON.stringify(array1)); 
        //shows: [[1,10],[2,10],[3,10],[4,10],[5,50],[6,50],[7,10],[8,10],[9,10]]
        

        我喜欢它只是 3 行代码,不需要任何内部函数调用,如 push() 或 sort() 甚至 if() 语句。

        【讨论】:

        【解决方案5】:

        简单的解决方案是这样的。

        function sumArrays(...arrays) {
          const n = arrays.reduce((max, xs) => Math.max(max, xs.length), 0);
          const result = Array.from({ length: n });
          return result.map((_, i) => arrays.map(xs => xs[i] || 0).reduce((sum, x) => sum + x, 0));
        }
        
        console.log(...sumArrays([0, 1, 2], [1, 2, 3, 4], [1, 2])); // 2 5 5 4
        

        【讨论】:

          猜你喜欢
          • 2011-10-29
          • 2021-10-09
          • 1970-01-01
          • 2018-03-04
          • 1970-01-01
          • 1970-01-01
          • 2017-08-28
          • 1970-01-01
          • 2020-07-22
          相关资源
          最近更新 更多