foreach 循环在执行最后一个数组之前退出



我试图通过删除for循环中的元素来制作foreach循环。但是对于每个循环在执行所有数组之前完成。我的意思是最后一个循环是 [ 6, 7, 6 ],我希望再运行一个循环,但它退出了。我可以使用 for 循环或其他方式来做到这一点,但我真的对为什么它在执行最后一个数组之前退出感到困惑。感谢您的任何帮助。

(数组包含奇数个元素,数组的每个元素都可以与具有相同值的另一个元素配对,但一个未配对的元素除外。

function example() {
let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];
A.forEach(element => {
for (let i = 0; i < A.length; i++) {
if (i === 0) continue;
if (A[i] === element) {
A.splice(i, 1);
A.shift();
break;
}
}
console.log(A);
});
return A[0];
}

输出:

[ 3, 3, 9, 7, 9, 7, 6, 7, 6 ]
[ 9, 7, 9, 7, 6, 7, 6 ]
[ 7, 7, 6, 7, 6 ]
[ 6, 7, 6 ]
6

expected:
[ 3, 3, 9, 7, 9, 7, 6, 7, 6 ]
[ 9, 7, 9, 7, 6, 7, 6 ]
[ 7, 7, 6, 7, 6 ]
[ 6, 7, 6 ]
[7]
7

这是因为使用了shift。我想你想知道为什么会发生这种情况,而不是如何解决它,对吧?您可以根据自己的需求找到解决方案,但在使用代码块解决之前,请阅读

。你可以阅读MDN网页文档的官方文档,shift()Array.forEach()如何工作。

MDN web Docs :: forEach()

在访问之前删除的元素不会被访问。如果在迭代期间删除了已经访问过的元素(例如使用 shift(((,则后面的元素将被跳过

它在最后一次迭代之前退出,这是因为,在前三次迭代之后,当您使用 shift 时,它会尝试移动到下一个索引,但在那个特定点只剩下 3 个元素,因为已经 for每个下一个索引是 3/4,对于这次迭代,forEach 停止作为索引将大于剩余项目的长度。

您可以检查以下代码和一些控制台日志:

function example() {
let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];
A.forEach((element, index) => {
// if you look carefully
// last index for this array will be 3
// means, it has already visited 4 items
// so, after shifting one more location
// it will stop
console.log(index);
for (let i = 0; i < A.length; i++) {
if (i === 0) continue;
if (A[i] === element) {
A.splice(i, 1);
A.shift();
break;
}
}
// this console log will tell you
// that it has 3 items left in
// this container
console.log(A);
});
return A[0];
}
console.log(example())

输出:

Current Index:  0
[ 3, 3, 9, 7, 9, 7, 6, 7, 6 ]
Current Index:  1
[ 9, 7, 9, 7, 6, 7, 6 ]
Current Index:  2
[ 7, 7, 6, 7, 6 ]
Current Index:  3 // look here, it means forEach() already visited 4 items
[ 6, 7, 6 ]
Final:  6

所以,希望这有帮助。

可能这不是最好的解决方案,但它应该适用于您所需的标准。

function example()
{
let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];
for (let j = 0; j < A.length-1 ; j++)
{
for (let i = 1; i < A.length; i++) {
if (A[i] === A[j])
{
j = j -1;
A.splice(i, 1);
A.shift();
break;
}
}
console.log(A);
}
return A[0];
}

function example() {
let A = [9, 3, 9, 3, 9, 7, 9, 7, 6, 7, 6];
A.forEach((element,index,array) => {

console.log("before removal: "+A.length+" ["+ A+"]"+"element: "+element +"index: "+index)

//splice("which index","howmany","toadd")
if (A[index] === element) {
A.splice(index, 1,"");
console.log("after removal: "+A.length+" ["+ A+"]")

}
console.log(A);
}

);


}
example();

在此代码中,I 刚刚删除了(迭代(索引并插入了空值 在那个地方,这样数组的大小就不会扰。在 您的代码错误是数组索引,索引已更新,但是 数组的元素进一步移动了一个索引,因此对于 index=1( 该数组在 .shift 之后更新,并且在索引 0 处有 2,这将 再也不会在迭代中访问(。

请耐心地浏览输出,我已经控制台了数组,以准确向您展示如何从数组中删除元素。 我不知道你为什么要显示 7 以及哪个索引。所以请把你的问题说得更清楚一点

最新更新