JavaScript获取矩阵数组的对角线

3
我希望用javascript获取矩阵数组的所有对角线。假设输入和输出如下:
input = [
  [1,2,3],
  [4,5,6],
  [7,8,9],
]

output = [
  [1],
  [4,2],
  [7,5,3],
  [8,6],
  [9],
]

如何将输入变成输出?如何做到对于任何大小的正方形网格(2x2、3x3、4x4等)都能有效?

谢谢!


一个4x4矩阵所输出的三角形会是什么样子? - L4zl0w
输入 = [ [1,2,3,4], [5,6,7,8], [9,10,11,12], [13,14,15,16] ] - Michael Mahony
输出结果不会是一个完美的三角形... - L4zl0w
@L4zl0w - 谁说了三角形?OP想要对角线。(虽然4x4的输出将是一个三角形状的数组。) - nnnnnn
代码应该输出对角线,就像问题中的示例输出一样。 - Michael Mahony
3个回答

2
const arr = [
    [11, 2, 4],
    [4, 5, 6],
    [10, 8, 12]
];
function diagonalDifference(arr) {
    const  primaryDiagonal = arr
        .map((e, i) => e[i])
        .reduce((mem, curr) => mem + curr, 0);
    const secondaryDiagonal = arr
        .map((e, i) => {
            let index = arr.length - i -1;
            return e[index];
        })
        .reduce((mem, curr) => mem + curr, 0);
    return Math.abs(primaryDiagonal - secondaryDiagonal);
}
console.log(diagonalDifference(arr));

0

首先想到的方法(不一定是最好的方法)就是使用一个循环沿着正方形的左边缘运行,然后再使用一个循环沿着正方形的底边运行。换句话说,我编写的代码完全按照手动获取对角线的方式进行操作,没有任何巧妙的优化。

请注意,这适用于任何大小的正方形,但不尝试处理矩形:我将其留给读者作为练习。

function getDiagonals(m) {
  var s, x, y, d,
      o = [];
  for (s = 0; s < m.length; s++) {
    d = [];
    for(y = s, x = 0; y >= 0; y--, x++)
      d.push(m[y][x]);
    o.push(d);
  }
  for (s = 1; s < m[0].length; s++) {
    d = [];
    for(y = m.length - 1, x = s; x < m[0].length; y--, x++)
      d.push(m[y][x]);
    o.push(d);
  }
  return o;
}

var output = getDiagonals(input);

我进行了几次简短的测试,它似乎可以工作,但你可以通过this demo自行尝试。


0
你可以使用这个:
var output = new Array(2*input.length-1);
for(var i=0; i<output.length; ++i) {
  output[i] = [];
  if(i < input.length) for(var j=0; j<=i; ++j)
    output[i].push(input[i-j][j]);
  else for(var j=input.length-1; j>i-input.length; --j)
    output[i].push(input[j][i-j]);
}

或者这样:

var output = new Array(2*input.length-1);
for(var i=0; i<output.length; ++i) {
  output[i] = [];
  for(var j=Math.min(i, input.length-1); j>Math.max(-1, i-input.length); --j)
    output[i].push(input[j][i-j]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接