【问题标题】:Javascript - zip and sum variable number of arrays in single expressionJavascript - 在单个表达式中压缩和求和可变数量的数组
【发布时间】:2025-12-30 06:05:06
【问题描述】:

answerJavascript equivalent of Python's zip function 展示了一种巧妙的方法,可以获取任意数量的数组,并在单个语句中将它们“压缩”到合并的数组中。

zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c]))

这个问题Javascript - Sum two arrays in single iteration 显示了一个类似的想法,但在压缩条目时对它们进行了汇总。

我想知道如何结合这两种技术 - 所以给定一个未知数量的数组:

[
  [1,2,3],
  [1,2,3],
  [1,2,3]
]

...结果是[3, 6, 9],即第一个元素、第二个元素之和,以此类推。为简单起见,假设每个数组包含相同数量的项目。

【问题讨论】:

    标签: javascript arrays


    【解决方案1】:

    与其他答案类似,只是不必那么复杂:

    numbers = [[1,2,3],[1,2,3],[1,2,3]];
    
    var result = numbers[0].map(function(_, i) { 
      return numbers.reduce(function(prev, row) {
        return row[i] + prev;
      }, 0);
    });
    
    console.log(result);

    【讨论】:

      【解决方案2】:

      我想我知道了 - 这个answer 很有帮助 - 我们可以扩展原来的压缩方法:

      zip = rows => rows[0].map((_,c) => rows.map(row=>row[c]).reduce((a,b) => a+b,0))
      

      【讨论】:

        【解决方案3】:

        首先转置数组,使列变为行,反之亦然。之后只需调用reduce 函数。

        为了简洁起见,代码的第一个版本主要是打字稿。第二个版本是 JavaScript。

        请注意,ES5 mapreduce 函数仅适用于 IE9 及更高版本。

        var numbers = [[1,2,3],[1,2,3],[1,2,3]]
        
        // TypeScript
        
        var colSums = numbers[0].map(function(col, i) { 
          return numbers.map((row) => row[i]).reduce((a,b) => a + b );
        });
        
        // JavaScript
        
        /*var colSums = numbers[0].map(function(col, i) {
          return numbers.map(function(row) {
            return row[i];
          }).reduce(function(a,b) {
            return a + b;
          });
        });*/
        document.getElementById("col-sums").innerHTML = colSums;
        <p id="col-sums"></p>

        【讨论】:

        • 看起来我们有同样的想法 - 你的是 ES5 兼容的(从 IE9 开始可以使用 map 和 reduce)
        【解决方案4】:

        不需要map、map、reduce,两张map就可以了:

        Quick Demo

        var m = [
          [1,2,3],
          [1,2,3],
          [1,2,3]
        ];
        
        var total = m.map(function(arr, i) {
          var count = 0;
          return arr.map(function(el, idx) {
            return count += m[idx][i];
          })
        }).pop()
        

        【讨论】:

        • 抱歉,这只是将前两个相加,结果为 [2,4,6]!