[英]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.