水平遍历 2D 数组 - javascript



如何水平循环这个 3x3 数组网格并打印出 1、4、7、2、5、8、3、6、9?

编辑:除了使用两个循环之外,是否有更有效的方法可以做到这一点,如果数组的长度不等于其他循环,这两个循环也有效?

let grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];

您可以使用嵌套for循环:

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

如果数组的长度都相同,你有很多答案可以工作。这是一种处理可能不同长度的数组的方法。它基本上一直运行到找不到更多数据:

let grid = [
[1, 2, 3, 4, 5],
[4, 5, 6, 7],
[7, 8, 9, 10, 11, 12]
];
let current = grid, i = 0
while(current.length){
current = grid.filter(arr => i < arr.length)
current.forEach(arr =>  console.log(arr[i]))
i++
}

for(var i = 0; i < grid.length; i++) {
var arr = grid[i];
for(var j = 0; j < arr.length; j++) {
console.log("array[" + i + "][" + j + "] = " + arr[j]);
}
}

你只需要找到内部数组和外部数组的大小

for(let i=0;i<countYourArraySize;i++)
{
for(let j=0;j<countYourInnerArayLength;j++)
{
console.log(grid[j][i])
}
}

let grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
let gridLength = grid[0].length;
let gridHeight = grid.length;
for(let l1=0; l1<gridLength;l1++) {
for(let l2=0; l2<gridHeight;l2++) {
console.log(grid[l2][l1]);
}
}

假设网格是矩形的(网格通常是;)的(,您可以遍历它,列在前,行在后,就像本片段中一样。

有一个问题,如果我们可以在没有 2 个循环的情况下做到这一点,我们可以并且我认为它实际上是更好、更干净的解决方案:

let grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
let gridLength = 3;
for(let l1=0; l1<gridLength*gridLength;l1++) {
console.log(grid[l1%gridLength][Math.floor(l1/gridLength)]);
}

如果你使用map,你可以只用一个(显式(循环来做到这一点:

let grid = [
[1,2,3],
[4,5,6],
[7,8,9]
];
let result = [];
for (let i=0; i < grid.length; i++) {
result = result.concat(grid.map((row) => row[i])));
}
console.log(result);

您可以在单个循环中执行此操作。但是长度必须相同

let grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
for (var i = 0; i < grid.length*grid.length; i++) {
var row = Math.floor(i / grid.length);
var col = i % grid.length;
console.log(grid[col][row]);
}

你需要使用嵌套的for 循环

所以请看一下我的解决方案:

let grid = [
[1,2,3],
[4,5,6],
[7,8,9]
];
for (let x = 0; x < grid[0].length; x++) {
for (let y = 0; y < grid.length; y++) { 
console.log(grid[y][x]);
}
}


此网格打印出预期的解决方案:1, 4, 7, 2, 5, 8, 3, 6, 9?


一些解释

在这种情况下,我们使用两种不同的for-loops

  • Xfor (let x = 0; x < 3; x++) {}的外部
  • 内部用于 Yfor (let y = 0; y < 3; x++) {}

注意:这仅在网格为矩形时才有效,因为使用grid[0].length会产生错误。


编辑:如果您只想使用单个循环,请尝试以下操作:

let grid = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
for (let i = 0 ; i < grid.length * grid[0].length ; i++)
console.log(grid[i % grid.length][parseInt(i / grid.length)]);

最新更新