当前位置: 首页 > 知识库问答 >
问题:

嵌套for循环和多维数组

赫连彬炳
2023-03-14

我试图弄清楚嵌套for循环是如何与JavaScipt中的多维数组一起工作的,但有一点让我有些困惑。以股票为例

var arr = [[1,2], [3,4], [5,6]];
for (var i=0; i < arr.length; i++) {
    for (var j=0; j < arr[i].length; j++) {
        console.log(arr[i][j]);
    }
}

这就是我所期望的结果123456。但是,如果我将数字添加到外部数组的末尾:

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

我仍然得到同样的输出1 2 3 4 5 6?我不明白为什么

var arr = [["a","b"], ["c","d"], "y", "z"];
for (var i=0; i < arr.length; i++) {
    for (var j=0; j < arr[i].length; j++) {
        console.log(arr[i][j]);
    }
}

输出是一个bcdyz,这是我所期望的。为什么字符串的行为会有所不同?

共有3个答案

子车睿
2023-03-14

下面是现代Javascript中的情况。

关于循环,所有的值都可以分为“可迭代”和“不可迭代”。迭代的值,你可以很好地...迭代-与for...的循环。

for (let item of someIterableThing)
    // use item

(你不使用裸for循环-for(var i... i

相反,如果你为…做。。。对于,使用不可编辑的内容,您将得到一个错误。

数组和字符串是可iterable值的示例,数字是不可iterable的。所以当你有

[ [1,2], [3,4], "foobar" ]

此数组中的所有项都是可迭代的,您的嵌套循环将正常工作。然而,在

[ [1,2], [3,4], 999]

最后一项不可iterable,嵌套循环将失败。

没有内置的方法来判断未知值是否可迭代,你必须为此编写一个函数:

 let isIterable = x => x && x[Symbol.iterator]

(参见专用主题)。

然后,可以安全地使用嵌套循环:

for (let item of array)
    if (isIterable(item))
        for (let subItem of item)
            console.log(subItem)
    else
        console.log(item)

顺便说一下,网上有很多关于Javascript的过时信息。语言在进化,5年前还不错的东西现在被认为是糟糕的做法。不幸的是,大多数教程、书籍和教师没有跟上,仍然推广旧的做法,比如在循环中使用裸露的

(既然人们问,为什么循环)的Bug <代码>是不好的,请考虑这个例子:

您有一个数组text,其中包含处理此数组的字符串和多个函数。程序员A以老式的方式编写这些函数:

for (var i = 0; i < text.length; i++)  
     do_something_with(text[i]) // ;(

程序员B用现代的方式编写:

for (let str of text)  
     do_something_with(str) // :)

现在,文本变得越来越大,不再适合内存。所以系统架构师决定用一个一次只能产生一个字符串的可简化文件对象来替换它。程序员A现在必须重写他所有的100个函数来适应新的界面:

  for (var file = TextFile; !file.eof(); file.getNext())
      do_something_with(file.currentLine)

包括很多疼痛、抽搐和头痛。

程序员B只是享受她的假期。)

微生曾琪
2023-03-14

StringArrayTypedArrayMapSet都是内置的iTerable,因为它们的每个原型对象都实现了一个@@iterator方法。而编号不可编辑:

const iterate = v => {
  for (var i = 0; i < v.length; i++) console.log(v[i])
}

iterate([1, 'two', 777]) // iterates by element
iterate('abc') // iterates by symbol
iterate(123) // does not iterate
凌俊语
2023-03-14

正如其他人提到的,您的内部循环都是关于迭代顶层(非嵌套数组)中的数组。它假设顶级数组中的所有元素都是嵌套数组,但事实并非如此。(在尝试遍历数组之前,需要确保您有一个数组。)由于顶层中的78不是数组,arr[i]。length返回数字的未定义,但字符串是“类似数组”的对象,并且具有length属性。一个“y”字符串的长度1,因此内部循环工作,因为它从零开始,并在“y”的字符串“数组”的零位置处获得字符,即“y”

但是,这是一个很好的理由,不使用传统的循环与数组,当我们现在有Array.for每个(),这消除了手动管理索引的需要,并允许我们访问值直接枚举而不用担心索引。

var arr = [[1,2], [3,4], [5,6], 7, 8];
var output = "";

// Enumerate the top-level array:
arr.forEach(function(value){
  // Check to see if the item is an array
  if(value instanceof Array){
    // If so, enuerate that nested array
    value.forEach(function(nestedValue){
      // Add the nested array's value to the output
      output += nestedValue + " " ;
    });
  } else {
    // Item is not an array, just add its value to the output
    output += value + " ";
  }
});

console.log(output);

 类似资料:
  • 例如,我有一个这样的数组 但输出只有11、12、13、14、15。我想打印所有的值。有人能帮我修改一下吗?提前谢谢

  • 和其他编程语言一样, Java 允许循环嵌套。如果把一个循环放在另一个循环体内,那么就可以形成嵌套循环。 嵌套循环既可以是 for循环嵌套 while 循环,也可以是 while 循环嵌套 do-while 循环 …… 即各种类型的循环都可以作为外层循环,也可以作为内层循环。 当程序遇到嵌套循环时,如果外层循环的循环条件允许,则开始执行外层循环的循环体,而内层循环将被外层循环的循环体来执行——只是

  • 我有一个嵌套的for循环,但是它会减慢一点处理速度,我如何才能使嵌套循环高效。我需要的是对于外循环的每个值,内循环继续其所有迭代。但是,我不认为它会像两个嵌套循环那样影响计算。我的第二个问题是,循环会影响速度还是会支持我的现象? 我的代码:

  • 并分别处理这两个数组。这是更好的解决方案吗?

  • 我对确定上述代码的BigO有点困惑。如果在最外层的循环中,则为(int x=1;x 然而,考虑到最外层循环迭代n 2次,这会改变bigO还是加法常数无关紧要的规则?最后,如果最内层循环迭代n 2次而不是n,会改变什么吗? 非常感谢。