遍历对象导致无限循环
Iterating over object results in infinite loop
我试图递归迭代一个对象,但陷入无限循环。我怀疑问题是我的for循环中的变量i
没有增加,但为什么?
我的代码:
var failsafe = 0;
function iter(obj) {
for (i = 0; i < obj.length; i++) {
console.log("Now #"+i);
if (typeof obj[i].contains == "object") {
console.log(obj[i].command);
iter(obj[i].contains);
} else {
console.log(obj[i].command);
}
if (failsafe==20) return false;
failsafe++;
}
}
iter(parsed);
控制台输入:
Now #0
do (5)
Now #0
move.up()
Now #1
move.left()
Now #2
if (check.up() == "item")
Now #0
move.down()
Now #2
if (check.up() == "item")
Now #0
move.down()
Now #2
if (check.up() == "item")
Now #0
move.down()
... and so on
对象:
[
{
"command":"do (5)",
"contains":[
{
"command":"move.up()",
"contains":false
},
{
"command":"move.left()",
"contains":false
},
{
"command":"if (kind == \"item\")",
"contains":[
{
"command":"move.down()",
"contains":false
}
]
},
{
"command":"move.right()",
"contains":false
}
]
}
]
问题是你从不声明 var i。因此,当您执行 for (i=0;...) 时,变量 i 实际上附加到 window(您可以通过记录 window.i 轻松检查)。
结果是您对所有循环使用相同的变量,问题是它每次都从 0 重新开始!
简单修复:for(var i = 0;...)
我试图递归迭代一个对象,但陷入无限循环。我怀疑问题是我的for循环中的变量i
没有增加,但为什么?
我的代码:
var failsafe = 0;
function iter(obj) {
for (i = 0; i < obj.length; i++) {
console.log("Now #"+i);
if (typeof obj[i].contains == "object") {
console.log(obj[i].command);
iter(obj[i].contains);
} else {
console.log(obj[i].command);
}
if (failsafe==20) return false;
failsafe++;
}
}
iter(parsed);
控制台输入:
Now #0
do (5)
Now #0
move.up()
Now #1
move.left()
Now #2
if (check.up() == "item")
Now #0
move.down()
Now #2
if (check.up() == "item")
Now #0
move.down()
Now #2
if (check.up() == "item")
Now #0
move.down()
... and so on
对象:
[
{
"command":"do (5)",
"contains":[
{
"command":"move.up()",
"contains":false
},
{
"command":"move.left()",
"contains":false
},
{
"command":"if (kind == \"item\")",
"contains":[
{
"command":"move.down()",
"contains":false
}
]
},
{
"command":"move.right()",
"contains":false
}
]
}
]
问题是你从不声明 var i。因此,当您执行 for (i=0;...) 时,变量 i 实际上附加到 window(您可以通过记录 window.i 轻松检查)。 结果是您对所有循环使用相同的变量,问题是它每次都从 0 重新开始!
简单修复:for(var i = 0;...)