Javascript获取矩阵数组的对角线

时间:2016-02-12 23:26:08

标签: javascript arrays

我想使用javascript获取矩阵数组的所有对角线。假设输入和输出如下:

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

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

如何将输入转换为输出?我怎么能这样做,它适用于任何大小的方格(2x2,3x3,4x4等)?

谢谢!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]);
}

答案 2 :(得分:0)

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));