繁体   English   中英

JavaScript for循环意外停止?

[英]Javascript for loop stops unexpectedly?

我有此功能,它必须从Firebase Firestore数据库中删除一个对象,并且还应该从该对象所属的用户中删除该对象的ID。 我正在使用double for循环来检查所有这些内容,并在它是对象ID时从用户中删除ID。 但是只要条件为真,则for循环立即停止执行。 这是功能结构:

removeObj(obj) {

  for (let i = 0; i < obj.users.length; i++) {
    for (let j = 0; j < obj.users[i].objects.length; j++) {

      //WHEN THIS CONDITION IS TRUE LOOP STOPS EXECUTION
      if (obj.id == obj.users[i].objects[j]) {
        //this scope never gets executed although the condition is true. 
        console.log("if is true");
        obj.users[i].objects.splice(j, 1);
      } else {
        console.log('object id : ', obj.users[i].objects[j])
      }
    }
  }
}

因此,在上面的代码中,当if语句的求值为true时,第二个for循环执行将停止(不检查第一个)。 陈述一切都是正确的,一切都很好。 但是,一旦它是真的,循环就会停止。 我尝试使用三重和双等号。 同样的行为。 我也尝试过foreach相同的行为。

不知道发生了什么。 提前致谢!

此示例中的obj结构:

obj = {
   id : "abcd",
   users : [
     {
        id : "aqwuiop",
        objects : [
           "tyui",
           "kjhg",
           "uhbg",
           "abcd",
           "fghj"
        ]
     },
     {...}
   ]
}

因此,发生的是我在日志中看到用户的objects数组的前3个元素来自else范围,但是在第四个元素中(如果应该将其评估为true,则在日志中看不到它)当然来自else范围,但我也看不到if范围中的日志。 并且第五个元素日志也不会出现,并且该函数的其余部分将被执行。

您需要反向/向后循环。

如注释中所述,当您从数组中删除元素时,数组本身将重新索引,因此for条件中的.length不再有效。

这是带有splice的反向循环的示例:

 const numbers = [1,2,3,4,5,6,7,8,9,10] // iterate from the last element towards the first. for (let i = numbers.length; i > 0; i--) { // remove all even numbers, ie the ones perfectly divisible by 2. if (numbers[i] % 2 === 0) { numbers.splice(i, 1) } } console.log(numbers) 

因为您正在对for循环进行迭代的对象上进行操作,所以这可能导致循环被缩短。

具体来说,行obj.users[i].objects.splice(j, 1); 可能导致意外行为。

拼接数组方法破坏性地运行,更改了for循环在其上运行的数组的内容。

if对原始数组执行if检查,然后将传递的元素复制到新数组中,而不是同时遍历数组并破坏性地操作数组,则可能更容易跟踪逻辑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM