如何将数组数组中相同索引处的元素加到一个数组中?

时间:2015-12-24 21:37:18

标签: javascript arrays grouping

假设我有一个数组数组,如下所示:

[
  [0, 1, 3],
  [2, 4, 6],
  [5, 5, 7],
  [10, 0, 3]
]

如何生成一个新数组,该数组在javascript中对内部数组的每个位置的所有值求和?在这种情况下,结果将是:[17,19,19]。无论内部数组的长度如何,我都需要能够提供一个有效的解决方案。我认为这可以使用map和for-of的一些组合,或者可能减少,但我不能完全围绕它。我搜索过但找不到任何与此相符的例子。

6 个答案:

答案 0 :(得分:41)

您可以将Array.prototype.reduce()Array.prototype.forEach()结合使用。



var array = [
        [0, 1, 3],
        [2, 4, 6],
        [5, 5, 7],
        [10, 0, 3]
    ],
    result = array.reduce(function (r, a) {
        a.forEach(function (b, i) {
            r[i] = (r[i] || 0) + b;
        });
        return r;
    }, []);
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
&#13;
&#13;

更新,通过采用减少阵列的地图来缩短方法。

&#13;
&#13;
var array = [[0, 1, 3], [2, 4, 6], [5, 5, 7], [10, 0, 3]],
    result = array.reduce((r, a) => a.map((b, i) => (r[i] || 0) + b), []);
    
console.log(result);
&#13;
&#13;
&#13;

答案 1 :(得分:9)

使用Lodash 4

function sum_columns(data) {
  return _.map(_.unzip(data), _.sum);
}

var result = sum_columns([
  [1, 2],
  [4, 8, 16],
  [32]
]);

console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

对于较旧的Lodash版本和一些备注

Lodash 4改变了_.unzipWith的工作方式,现在iteratee一次获得作为扩展参数传递的所有值,所以我们不能再使用reducer样式_.add了。使用Lodash 3,以下示例可以正常运行:

function sum_columns(data) {
  return _.unzipWith(data, _.add);
}

var result = sum_columns([
  [1, 2],
  [4, 8, 16],
  [32],
]);

console.log(JSON.stringify(result));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

_.unzipWith将插入undefined s,其中行比其他行短,_.sum将未定义的值视为0.(自Lodash 3起)

如果您的输入数据可以包含undefinednull项,并且您希望将其视为0,则可以使用此项:

function sum_columns_safe(data) {
  return _.map(_.unzip(data), _.sum);
}

function sum_columns(data) {
  return _.unzipWith(data, _.add);
}

console.log(sum_columns_safe([[undefined]])); // [0]
console.log(sum_columns([[undefined]]));      // [undefined]
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>

这个snipet适用于Lodash 3,遗憾的是我没有找到一个很好的方法,在Lodash 4中将undefined视为0,因为现在总和被更改为_.sum([undefined]) === undefined

答案 2 :(得分:5)

ES6中的单行,mapreduce

var a = [ [0, 1, 3], [2, 4, 6], [5, 5, 7], [10, 0, 3] ];

var sum = a[0].map((_, i) => a.reduce((p, _, j) => p + a[j][i], 0));

document.write(sum);

答案 3 :(得分:0)

假设嵌套数组总是具有相同的长度,可以使用concat和reduce。

&#13;
&#13;
    function totalIt (arr) {
        var lng = arr[0].length;
       return [].concat.apply([],arr)  //flatten the array
                .reduce( function(arr, val, ind){ //loop over and create a new array
                    var i = ind%lng;  //get the column
                    arr[i] = (arr[i] || 0) + val; //update total for column
                    return arr;  //return the updated array
                }, []);  //the new array used by reduce
    }
    
    var arr = [
      [0, 1, 3],
      [2, 4, 6],
      [5, 5, 7],
      [10, 0, 3]
    ];
    console.log(totalIt(arr));  //[17, 10, 19]
&#13;
&#13;
&#13;

答案 4 :(得分:0)

假设数组是静态的,如op showned。

View#getContext()

答案 5 :(得分:-1)

POKE