二维数组中的增强 for 循环 - JavaScript

Posted

技术标签:

【中文标题】二维数组中的增强 for 循环 - JavaScript【英文标题】:Enhanced for loop in 2D Array - JavaScript 【发布时间】:2011-05-24 02:27:27 【问题描述】:

我在 javascript 中创建了以下二维数组

// Create basic linear array
var ImgArray = new Array(4);

// Do the 2D array for each or the linear array slots
for (i=0; i < 4 ; i++) 
    ImgArray[i] = new Array(4)

现在我想使用 2 个“增强的 for 循环”对其进行迭代。但是我坚持如何使用循环,因为只有ImgArray 这么说。例如;

// Load the images
for(var i in ImgArray)  
    for( ??? )            // How would i do this? What do i state as an array?
          ///...
    
    document.write("<br>");

任何建议都非常感谢

【问题讨论】:

另外:停止使用document.write() - 这很邪恶:-) document.write 可以,“增强的 for 循环”(for...in 数组)不行。 @Pointy:document.write没有错,使用得当。 如果你使用var a = new Array(4),记住它会创建一个长度为4但不包含任何元素的数组,a[1]会返回undefined,但a.length会返回4 . @Tim Down, @Carlos - document.write() 是做它做的事情之一,它本质上并不是“坏”,但它是一种真正需要新的做事方式方法。更好的方法是在文档加载后通过 DOM 操作。 @Tim 那里的密钥正确使用 【参考方案1】:

假设您已经创建了数组,循环如下所示:

var i, j, entry, ImgArray;

// Create the array
ImgArray = new Array(4);
for (i=0; i < 4 ; i++) 
    ImgArray[i] = new Array(4);


// Loop through both dimensions
for (i = 0; i < ImgArray.length; ++i) 
    entry = ImgArray[i];
    for (j = 0; j < entry.length; ++j) 
        // Do something with entry[j]
    

这是因为 JavaScript 中没有二维数组。 (事实上​​,即使是arrays aren't really arrays,但我们不要去那里。)有“数组”,一个数组条目可以是另一个数组,但一个数组条目可能比其他数组条目更长或更短。因此,您检索该数组并循环遍历 its 长度,这可能与同一“维度”中的其他数组不同。

请注意,我没有在上面使用for..in不要使用for..in 循环遍历数组,除非你真的知道自己在做什么; details here。 (如果您确实真的知道自己在做什么并采取足够的预防措施,那很好,但您引用的代码没有采取必要的预防措施。)for..in 迭代数组的索引,它会枚举一个对象的属性名。

题外话#1:在 JavaScript 中,约定(您可以随意忽略)是仅对构造函数使用首字母大写 (ImgArray)。

离题 #2:您可能会考虑使用数组字面量 ([entry, entry, entry]) 而不是 new Array(...),但这取决于您在做什么。

题外话#3:依赖分号插入是一个非常糟糕的主意(就像你的ImgArray[i] = new Array(4) 行一样)。确保在需要的地方加上分号,否则你会发现你不能正确地缩小你的脚本和/或你会遇到一些浪费你时间的奇怪错误。 :-)

【讨论】:

+1,也是主题 #1:不要使用 for ... in 来遍历数组。 (你的代码是这么说的,但我想我只是用文字添加) @casablanca:哈哈,我刚刚看到他正在使用它,并按照您的评论添加它。 :-) 如果您了解自己在做什么并正确处理它,那很好,但大多数人了解他们在做什么并且处理它财产,所以... @Carlos:你可以做imgArray[1][3]imgArray[1] 返回一个数组,imgArray[1][3] 访问该数组的第四个元素。 @Felix:是的,你可以,好点。虽然问题是关于循环的,但我不会在循环中这样做,因为在遍历数组内容时重复查找数组 (imgArray[1]) 是很浪费的(这就是我上面有 entry 变量的原因)。尽管如此,当你不循环时,没有理由不能这样做。 @TJCrowder:我完全同意你的看法。【参考方案2】:

这不是“增强的for 循环”。无论如何,您不应该以这种方式遍历 Array 实例,至少当您在语义上将它们视为整数索引数组时不会。

使用您的原件

for (var i = 0; i < 4; ++i)

方法(并且不要忘记var)。也别理会

var ImgArray = new Array(4);

随便写

var ImgArray = [];

【讨论】:

【参考方案3】:

你只需要为这两者做一个 for 循环

for (var i in array)
   for(var j in array[i])//do stuff here

【讨论】:

请谨慎使用hasOwnProperty

以上是关于二维数组中的增强 for 循环 - JavaScript的主要内容,如果未能解决你的问题,请参考以下文章

Java 增强for循环

java中何用for循环将一个二维数组的值付给另外一个二维数组

增强for循环

增强for循环

如何使用 for 循环将一维数组的值放入 C++ 中的二维数组

根据一维数组中的值更改二维numpy数组中的某些值而无需for循环