【问题标题】:using es6 functions for matrix calculation使用 es6 函数进行矩阵计算
【发布时间】:2018-02-12 09:46:14
【问题描述】:

我需要对样本矩阵的元素进行一些计算,它们位于选择性对角线上(这里是对 2 个分离的对角线求和)。所以我可以很容易地用 for 循环来做到这一点:

let matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] ;

let sum1=0;
let sum2 = 0;

for (var i=0;i<matrix.length-1;i++) {
  sum1+=matrix[i][i+1];
  sum2+=matrix[i+1][i];
}
console.log(sum1,sum2) ;

问题是: 是否可以在没有 for 循环的情况下使用 es6 函数(如 reduce、map 等)来做到这一点?

【问题讨论】:

  • 当然有可能,reduce 相当无所不能。但无论如何它归结为内部循环,所以不要指望它更有效。您是否尝试过使用它们中的任何一个?你可以在网上找到很多sum 函数和reduce 的示例。
  • 顺便说一句,这些都来自 ES5 :-)

标签: javascript arrays ecmascript-6


【解决方案1】:

是的,可以使用reduce() 方法:

const matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]];

const sum1 = matrix.reduce((acc, x, i) =>
    acc + (i < matrix.length - 1
      ? x[i + 1]
      : 0
    )
  , 0);

const sum2 = matrix.reduce((acc, x, i) =>
    acc + (i != 0
      ? x[i - 1]
      : 0
    )
  , 0);

console.log(sum1,sum2);

请注意,reduce()map() 都是在 ES5 中引入的,而不是 ES6。

【讨论】:

  • @ARYAMAN 是的。只需使用您开始使用的简单快速的循环即可。
【解决方案2】:

您可以使用reduce

var output = matrix.reduce( (a,c,i,ar) => (
    a[0] += ar[i][i+1] || 0 ,  //sum1
    a[1] += (ar[i+1] ? ar[i+1][i] : 0),  //sum2
    a ), //return the accumulator 
    [0,0]); //initial value

输出是[sum1, sum2]的数组

演示

var matrix = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9, 10, 11, 12],
  [13, 14, 15, 16]
];
var output = matrix.reduce((a, c, i, ar) => (
    a[0] += ar[i][i + 1] || 0, //sum1
    a[1] += (ar[i + 1] ? ar[i + 1][i] : 0), //sum2
    a), //return the accumulator 
  [0, 0]); //initial value

console.log(output);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 2015-12-17
    • 2022-01-15
    相关资源
    最近更新 更多