.options
Kolekcja jest (niestety) na żywo , więc iteracji przez elementy kolekcja Live za jeden po drugim i .remove
ing każdy spowoduje każdej nieparzystej jeden trzymane. (Np, tuż po wyjęciu pierwszego elementu, [0]
th element kolekcji natychmiast stać się następny element w kolekcji - co kiedyś [1]
staną się [0]
(a następnie raz przejść do następnego indeksu w [1]
The nowa pozycja w pozycji 0 się nie powtórzy)
document.querySelectorAll
Zamiast tego użyj , który zwraca statyczną kolekcję:
for (const option of document.querySelectorAll('#form-select > option')) {
option.remove();
}
<select id="form-select">
<option>111</option>
<option>222</option>
<option>333</option>
</select>
Możesz również przenieść się do tablicy (statycznej) przed usunięciem elementów:
for (const option of [...document.querySelector('#form-select').options]) {
option.remove();
}
<select id="form-select">
<option>111</option>
<option>222</option>
<option>333</option>
</select>
Innym rozwiązaniem, które właśnie się dzieje, do pracy, ponieważ kolekcja jest na żywo (ale prawdopodobnie nie powinny być stosowane, ponieważ nie jest intuicyjny):
const { options } = document.querySelector('#form-select');
while (options.length) {
options[0].remove();
}
<select id="form-select">
<option>111</option>
<option>222</option>
<option>333</option>
</select>
CertainPerformance
źródło
.options
To nie tablica, która jest źródłem problemu - to raczej HTMLCollection, który znajduje się pod napięciem. Gdyby to była tablica, byłaby statyczna i nie byłoby żadnych problemów.HTMLOptionsCollection
Obiekt działa w tym kontekście jak tablica.Widzę, że twoim głównym celem jest zrozumienie procesu, który to powoduje, więc powinno to zilustrować problem:
Ta pętla przechodzi dokładnie ten sam rodzaj procesu, co twoja pętla „for .. of”, aby dać ci dodatkowe efekty w końcowym wyniku. Problem polega na tym, że niszczy swoje własne indeksy podczas ich iteracji, zmieniając w ten sposób wartość, do której
i
tak naprawdę się odnosi. Kiedy mam do czynienia z tym problemem, lubię zapętlać tablicę do tyłu, aby moje własne zniszczenie nie miało na mnie wpływu, tak:Mam nadzieję, że to pomoże ci dokładnie zrozumieć, co się tutaj dzieje. Jeśli masz jakieś pytania, zostaw komentarz.
źródło
Pętla przechodzi przez tę samą tablicę, w której indeks zmienia się po usunięciu elementu z tablicy. Poniżej znajduje się przykład, w którym można przeglądać opcje bez indeksu i usuwać go z tablicy.
Oto skrzypce
źródło