对于多维javascript数组中的循环

Sat*_*nix 31 javascript loops multidimensional-array

从现在开始,我正在使用这个循环迭代数组的元素,即使我在其中放置具有各种属性的对象,它也能正常工作.

var cubes[];

for (i in cubes){
     cubes[i].dimension
     cubes[i].position_x
     ecc..
}
Run Code Online (Sandbox Code Playgroud)

现在,让我们假设cubes []以这种方式声明

var cubes[][];
Run Code Online (Sandbox Code Playgroud)

我可以在Javascript中执行此操作吗?我怎样才能自动迭代

cubes[0][0]
cubes[0][1]
cubes[0][2]
cubes[1][0]
cubes[1][1]
cubes[1][2]
cubes[2][0]
ecc...
Run Code Online (Sandbox Code Playgroud)

作为一种解决方法,我可以声明:

var cubes[];
var cubes1[];
Run Code Online (Sandbox Code Playgroud)

并与两个数组分开工作.这是更好的解决方案吗?

icy*_*com 51

你可以这样做:

var cubes = [
 [1, 2, 3],
 [4, 5, 6],    
 [7, 8, 9],
];

for(var i = 0; i < cubes.length; i++) {
    var cube = cubes[i];
    for(var j = 0; j < cube.length; j++) {
        display("cube[" + i + "][" + j + "] = " + cube[j]);
    }
}
Run Code Online (Sandbox Code Playgroud)

工作jsFiddle:

以上输出:

cube[0][0] = 1
cube[0][1] = 2
cube[0][2] = 3
cube[1][0] = 4
cube[1][1] = 5
cube[1][2] = 6
cube[2][0] = 7
cube[2][1] = 8
cube[2][2] = 9
Run Code Online (Sandbox Code Playgroud)

  • @AndersonGreen OP专门寻找2D阵列,因此上面的答案.感谢您的链接 - 希望它有助于将来寻找类似解决方案的人! (2认同)

bin*_*ous 15

var cubes = [["string", "string"], ["string", "string"]];

for(var i = 0; i < cubes.length; i++) {
    for(var j = 0; j < cubes[i].length; j++) {
        console.log(cubes[i][j]);
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 7

循环数组的有效方法是内置数组方法.map()

对于一维数组,它看起来像这样:

function HandleOneElement( Cuby ) {
   Cuby.dimension
   Cuby.position_x
   ...
}
cubes.map(HandleOneElement) ; // the map function will pass each element
Run Code Online (Sandbox Code Playgroud)

对于二维数组:

cubes.map( function( cubeRow ) { cubeRow.map( HandleOneElement ) } )
Run Code Online (Sandbox Code Playgroud)

对于任何形式的n维数组:

Function.prototype.ArrayFunction = function(param) {
  if (param instanceof Array) {
    return param.map( Function.prototype.ArrayFunction, this ) ;
  }
  else return (this)(param) ;
}
HandleOneElement.ArrayFunction(cubes) ;
Run Code Online (Sandbox Code Playgroud)


Mic*_*ice 5

试试这个:

var i, j;

for (i = 0; i < cubes.length; i++) {
    for (j = 0; j < cubes[i].length; j++) {
       do whatever with cubes[i][j];
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 增加了var i,j; 公平地说,他没有说,"不要创造全局变量." ;-) (5认同)

Web*_*ian 5

有点晚了,但是这个解决方案很棒又整洁

const arr = [[1,2,3],[4,5,6],[7,8,9,10]]
for (let i of arr) {
  for (let j of i) {
    console.log(j) //Should log numbers from 1 to 10
  }
}
Run Code Online (Sandbox Code Playgroud)

或您的情况:

const arr = [[1,2,3],[4,5,6],[7,8,9]]
for (let [d1, d2, d3] of arr) {
  console.log(`${d1}, ${d2}, ${d3}`) //Should return numbers from 1 to 9
}
Run Code Online (Sandbox Code Playgroud)

注意: for ... of循环在ES6中是标准化的,因此仅当您具有ES5 Javascript编译器(例如Babel)时才使用此循环

另注:还有其他选择,但他们有一些细微的差别和行为,如forEach()for...infor...of和传统for()。取决于您的情况来决定使用哪个。(ES6还具有.map().filter().find().reduce()