Это из-за использования shift
. Я думаю, вы хотели знать, почему это происходит, а не как это решить, верно? Вы можете найти решения, основанные на ваших требованиях, но прочитайте, прежде чем решать их, используя кусок кода.
Вы можете прочитать официальный документ веб-документов MDN о том, как работает shift()
, Array.forEach()
.
MDN web Docs :: forEach()
элементы, которые были удалены до посещения, не посещаются. Если уже посещенные элементы удаляются (например, с помощью shift ()) во время итерации, более поздние элементы будут пропущены
, он выходит до последней итерации, это потому, что после первых трех итераций, когдавы используете shift, он будет пытаться перейти к следующему индексу, но в этой определенной точке останется только 3 элемента, так как уже для следующего индекса равен 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
Итак, надеюсь, это поможет.