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

hml*_*lee 15 javascript arrays grouping

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

[
  [0, 1, 3],
  [2, 4, 6],
  [5, 5, 7],
  [10, 0, 3]
]
Run Code Online (Sandbox Code Playgroud)

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

Nin*_*olz 45

你可以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>');
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)


Tam*_*dus 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));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)

对于较旧的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));
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)

_.unzipWith将插入undefineds比其他行短的行,并将_.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]
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js"></script>
Run Code Online (Sandbox Code Playgroud)

这个snipet适用于Lodash 3,不幸的是我没有找到一个很好的方法,在Lodash 4中将undefined视为0,因为现在sum已经改变了 _.sum([undefined]) === undefined


isv*_*all 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);
Run Code Online (Sandbox Code Playgroud)