如何在javascript中对角遍历数组

vip*_*ria 23 javascript arrays iteration loops matrix

我有一个字符串数组,我想对角线遍历.
假设:

  • 每个字符串的长度相同.
  • 阵列可以是正方形或矩形,水平或垂直.

矩阵看起来像这样:

A B C D
E F G H
I J K L
Run Code Online (Sandbox Code Playgroud)

我想(从左上角到右下角):

A
EB
IFC
JGD
KH
L
Run Code Online (Sandbox Code Playgroud)

和(从左下角到右上角):

I
JE
KFA
LGB
HC
D
Run Code Online (Sandbox Code Playgroud)

我已经有一段代码可以工作3/4,但我似乎无法弄清楚我在做什么(错误).

//the array
var TheArray = ['ABCD','EFGH','IJKL'];

//amount of rows
var RowLength = TheArray.length;
//amount of colums
var ColumnLength = TheArray[0].length;
Run Code Online (Sandbox Code Playgroud)

我的代码将对角线切入这些循环中的4个以获得所有对角线.对于循环,它看起来是2,而if不循环未绑定的值.伪代码看起来有点像这样:

for(loop rows){
 var outputarray = [];
   for(loop columns){
      if(delimit for out of bound){
       var temprow = TheArray[something?];
       var tempvalue = temprow[something?];
       outputarray.push(tempvalue);
       }
   }
 //use values
document.getElementById("theDiv").innerHTML += outputarray.join("")+"<br>";
}
Run Code Online (Sandbox Code Playgroud)

我希望有人可以帮助我.

Joh*_*ers 17

从左上角到右下角

var array = ["ABCD","EFGH","IJKL"];

var Ylength = array.length;
var Xlength = array[0].length;
var maxLength = Math.max(Xlength, Ylength);
var temp;
for (var k = 0; k <= 2 * (maxLength - 1); ++k) {
    temp = [];
    for (var y = Ylength - 1; y >= 0; --y) {
        var x = k - y;
        if (x >= 0 && x < Xlength) {
            temp.push(array[y][x]);
        }
    }
    if(temp.length > 0) {
        document.body.innerHTML += temp.join('') + '<br>';
    }
}
Run Code Online (Sandbox Code Playgroud)

(另见小提琴)


从左下角到右上角

var array = ["ABCD","EFGH","IJKL"];

var Ylength = array.length;
var Xlength = array[0].length;
var maxLength = Math.max(Xlength, Ylength);
var temp;
for (var k = 0; k <= 2 * (maxLength - 1); ++k) {
    temp = [];
    for (var y = Ylength - 1; y >= 0; --y) {
        var x = k - (Ylength - y);
        if (x >= 0 && x < Xlength) {
            temp.push(array[y][x]);
        }
    }
    if(temp.length > 0) {
        document.body.innerHTML += temp.join('') + '<br>';
    }
}
Run Code Online (Sandbox Code Playgroud)

(另见小提琴)


综合

由于两者之间只有一条差异线,因此您可以轻松地将它们组合在一个函数中:

var array = ["ABCD","EFGH","IJKL"];

function diagonal(array, bottomToTop) {
    var Ylength = array.length;
    var Xlength = array[0].length;
    var maxLength = Math.max(Xlength, Ylength);
    var temp;
    var returnArray = [];
    for (var k = 0; k <= 2 * (maxLength - 1); ++k) {
        temp = [];
        for (var y = Ylength - 1; y >= 0; --y) {
            var x = k - (bottomToTop ? Ylength - y : y);
            if (x >= 0 && x < Xlength) {
                temp.push(array[y][x]);
            }
        }
        if(temp.length > 0) {
            returnArray.push(temp.join(''));
        }
    }
    return returnArray;
}

document.body.innerHTML = diagonal(array).join('<br>') +
                          '<br><br><br>' +
                          diagonal(array, true).join('<br>');
Run Code Online (Sandbox Code Playgroud)

(另见小提琴)


wvd*_*vdz 6

这样做,并将所需的结果输出到屏幕:

var array = ['ABCD','EFGH','IJKL'];
var rows = array.length;
var cols = array[0].length;
for (var n = 0; n < cols + rows - 1; n += 1)
{
  var r = n;
  var c = 0;
  var str = '';
  while (r >= 0 && c < cols)
  {
    if (r < rows)
      str += array[r][c];
    r -= 1;
    c += 1;
  }
  document.write(str+"<br>");
}
Run Code Online (Sandbox Code Playgroud)

结果:

A
EB
IFC
JGD
KH
L
Run Code Online (Sandbox Code Playgroud)