【问题标题】:matrix (array of arrays|bidimensional array) sum without loops. There are a better way?矩阵(数组数组|二维数组)求和,没有循环。有更好的方法吗?
【发布时间】:2021-11-30 21:09:31
【问题描述】:

我正在考虑一种无需使用循环即可进行矩阵求和的方法,我意识到使用 Array.prototype.map() 是一个好方法。

var multArray = [[1,2,3,4,5],[6,7,8,9,10]];
var multArray2=[[1,2,3,4,5],[6,7,8,9,10]];
total   =  multArray.map((array, arrayIndex) => array.map((value, index) => value + multArray2[arrayIndex][index]));
console.log(total);

你知道是否有更好或更短的方法吗?

谢谢!

【问题讨论】:

  • 循环有什么坏处,什么时候它们会是一种更清洁的方法?

标签: javascript arrays matrix multidimensional-array


【解决方案1】:

“更好”是主观的,但你可以这样做:

var multArray = [[1,2,3,4,5],[6,7,8,9,10]];
var multArray2=[[1,2,3,4,5],[6,7,8,9,10]];
console.log(
  [...Array(multArray.length).keys()].map(
     f => [...Array(multArray[f].length).keys()].map(
        s => multArray[f][s] + multArray2[f][s]
     )
  )
)

但 IMO 你的更易读

【讨论】:

    【解决方案2】:

    我认为一个简单的for 循环在清楚地显示正在发生的事情方面是最明确的。

    const multArray = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],];
    const multArray2 = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],];
    
    const total = [];
    
    for (let i = 0; i < multArray.length; i++) {
      total[i] = [];
      for (let j = 0; j < multArray[i].length; j++) {
        total[i][j] = multArray[i][j] + multArray2[i][j];
      }
    }
    
    console.log(total);

    但如果你真的不想这样做,你可以定义一些实用函数并将它们链接起来。

    const multArray = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],];
    const multArray2 = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],];
    
    const zip = (a, b) => a.map((k, i) => [k, b[i]]);
    const sum = (arr) => arr.reduce((a, b) => a + b, 0);
    
    const total = zip(multArray, multArray2).map((c) => zip(...c).map(sum));
    
    console.log(total);

    通过重新定义 zip() 函数以接受任意数量的参数,从而允许您通过简单地将它们全部传递给初始 zip 调用(并避免显式编写嵌套每个附加数组的循环)。

    const multArray = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],];
    const multArray2 = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],];
    const multArray3 = [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10],];
    
    const zip = (...rows) => [...rows[0].keys()].map((k) => rows.map((row) => row[k]));
    const sum = (arr) => arr.reduce((a, b) => a + b, 0);
    
    const sum_mult_arrays = (...arrs) => zip(...arrs).map((c) => zip(...c).map(sum));
    
    const total = sum_mult_arrays(multArray, multArray2, multArray3);
    
    console.log(total);

    请参阅Javascript equivalent of Python's zip function,了解有关压缩的大量讨论。

    【讨论】:

      猜你喜欢
      • 2014-02-16
      • 1970-01-01
      • 2019-10-27
      • 1970-01-01
      • 1970-01-01
      • 2015-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多