La .options
colección es (desafortunadamente) en vivo , por lo que iterar sobre los elementos de la colección en vivo uno por uno y hacer que .remove
todos se mantengan. (Por ejemplo, justo cuando se quita el primer elemento, el [0]
artículo del th de la colección se convertirá inmediatamente en el siguiente elemento de la colección - lo que solía ser [1]
se convertirá en [0]
(y luego una vez que vaya a la siguiente índice en [1]
el nuevo elemento en la posición 0 no se repetirá)
Utilizar document.querySelectorAll
lugar, que devuelve una colección que es estática:
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>
También puede extenderse a una matriz (estática) antes de eliminar elementos ::
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>
Otra opción que se acaba pasa a trabajar porque la colección es en vivo (pero probablemente no se debe utilizar, ya que no es intuitiva):
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>
Cierto rendimiento
fuente
.options
es no una matriz, que es la fuente del problema - más bien, se trata de una HTMLCollection, que es en vivo. Si fuera una matriz, sería estática y no habría ningún problema.HTMLOptionsCollection
objeto actúa en este contexto como una matriz.Veo que su objetivo principal es comprender el proceso que hace que esto suceda, por lo que esto debería ilustrar el problema para usted:
Este ciclo pasa exactamente por el mismo tipo de proceso por el que pasa tu ciclo "for .. of" para dejarte con extras en el resultado final. El problema es que está destruyendo sus propios índices a medida que los itera, cambiando así el valor al que
i
realmente se refiere. Cuando me enfrento a este problema, me gusta recorrer la matriz hacia atrás para que mi propia destrucción no me afecte, así:Espero que esto te ayude a comprender lo que está sucediendo aquí a fondo. Si tiene alguna pregunta, no dude en dejarme un comentario.
fuente
Está recorriendo la misma matriz donde el índice cambia una vez que elimina el elemento de la matriz. A continuación se muestra el ejemplo donde puede recorrer las opciones sin índice y eliminarlo de la matriz.
Aquí está el violín
fuente