【问题标题】:javascript for loop random returnjavascript for循环随机返回
【发布时间】:2012-08-28 07:11:54
【问题描述】:

我有这么小的代码源

for (i = 0; i < elements.length; i++) {
     console.log(i);
     (function (i) {
         if (elements[i]["id"] == id) {
             index = i;
             console.log(i);
         }
     })(i);
}

console.log(index);

我想找到一个数组的元素索引,其中 sub element "id" = id;但它有时会返回 0 次 1 次。此代码位于类内的函数内。我两次调用同一个函数,但在类外使用不同的参数,所以首先它必须显示 0 和 1,但有时它显示 1 和 0。你能帮帮我吗?这个方法我也试过了,还是不行。

var i = 0;
while (i < elements.length) {
    console.log(elements[i]["id"]);
    if (elements[i]["id"] == id) {
        index = i;
        break;
    } else if (elements[i]["id"] != id) {
        i++;
    }
}

console.log(index);

Here is my test page, 如果你用 Chrome 打开它(有时它会发生,但在 Firefox 中它主要发生)你会看到有时会出现小图像,但有时当你按下按钮时它会消失。您还可以在“inspect elements -> console”中看到控制台输出

编辑

为了更好地调试,我更改了代码(正如 Lando 建议的那样):

for (i in elements){
    console.log("comparing elements['"+ i +"']['id']: "+ elements[i]["id"] +" with id:' "+ id + "'");
        if(elements[i]["id"] == id){
            index = i;
        }
    }

console.log(index);

得到控制台输出:

comparing elements['0']['id']: id2 with id:' id1' Slideshow.js:140
comparing elements['1']['id']: id1 with id:' id1' Slideshow.js:140
1 Slideshow.js:147
comparing elements['0']['id']: id2 with id:' id2' Slideshow.js:140
comparing elements['1']['id']: id1 with id:' id2' Slideshow.js:140
0 

什么时候应该:

comparing elements['0']['id']: id1 with id:' id1' Slideshow.js:140
comparing elements['1']['id']: id2 with id:' id1' Slideshow.js:140
0 Slideshow.js:147
comparing elements['0']['id']: id1 with id:' id2' Slideshow.js:140
comparing elements['1']['id']: id2 with id:' id2' Slideshow.js:140
1 

编辑 2

在看到输出后发现数组“元素”中的对象改变了位置,elements[0]["id"] 变成了"id2" 它应该在"id1" 我仍然不能明确地说为什么会发生这种情况或该怎么做修理它。所以如果您有任何想法,请分享它。

Here is my JSfiddle link

【问题讨论】:

  • else if (elements[i]["id"] != id) ??你可以用 else 替换它
  • 那不是答案,而是评论:)
  • 旁注:第一个 sn-p 中的关闭是不需要的。如果涉及到 async (例如绑定事件处理程序、超时等),您只需要这种类型的构造
  • 我更新了我的帖子,您可以在其中看到测试网页和问题本身
  • 您的代码按预期工作,您看到它返回 0 和 1 的原因是因为该方法被调用了两次,一次使用“id1”,一次使用“id2” $("#has" ).click(function(){ slideshow.animate('#id1', {opacity: 1}, 500); slideshow.animate('#id2', {x:200, y:100, opacity: 1}, 300 ); });

标签: javascript random for-loop while-loop


【解决方案1】:

我认为您必须将代码更改为此,没有内部函数(闭包)(第一个 console.log 将帮助您调试代码(或者您可以只使用 firebug 并在该行设置断点)

for (i in elements){
    console.log("comparing elements['"+ i +"']['id']: "+ elements[i]["id"] +" with id:'"+ id + "'");
    if(elements[i]["id"] == id){
        index = i;
        console.log(i);
    }
}

console.log(index);

请记住,javascript 数组不一定是从零开始的,甚至不一定是顺序的,因此“for in”将帮助您避免可能的错误。我删除了闭包,因为在这种情况下我认为您实际上不需要它。

【讨论】:

  • 我按照你写的去做,修改了我的第一篇文章。
  • 嗯,从日志中可以看出,问题实际上不是 for 循环,而是数组:在两次运行中,数组都是这样的 ['id2', 'id1'] 所以在第一个当您搜索“id1”时运行,它将返回“1”,而在第二次运行时,当您搜索“id2”时,它将返回“0”。
【解决方案2】:

我发现了问题所在。似乎有时会加载小图像,第一个如此大的图像出现在顶部。这都是关于图像加载的。还是谢谢大家的回答,大家帮我调试一下问题。

【讨论】:

    猜你喜欢
    • 2016-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 2016-06-19
    • 2012-05-15
    • 1970-01-01
    相关资源
    最近更新 更多