A .options
coleção é (infelizmente) ativa , portanto, a iteração dos itens da coleção ao vivo um por um e .remove
cada um resultará na manutenção de todos os itens ímpares. (Por exemplo, certo quando você remove o primeiro item, o [0]
item de th da coleção se tornará imediatamente o próximo item na coleção - que costumava ser [1]
passará a ser [0]
(e, em seguida, uma vez que você vá para o próximo índice no [1]
, o novo item em posição 0 não será repetido)
Use em document.querySelectorAll
vez disso, que retorna uma coleção que é 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>
Você também pode se espalhar para uma matriz (estática) antes de remover os 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>
Outra opção, que só acontece ao trabalho porque a coleção é ao vivo (mas provavelmente não deve ser utilizado, uma vez que não é intuitivo):
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>
.options
é um array, que é a fonte do problema - é um HTMLCollection, que está ativo. Se fosse uma matriz, seria estática e não haveria problemas.HTMLOptionsCollection
objeto atua nesse contexto como uma matriz.Vejo que seu principal objetivo é entender o processo que faz com que isso aconteça, portanto, isso deve ilustrar o problema para você:
Esse loop passa exatamente pelo mesmo tipo de processo que o loop "for .. of" passa para deixar extras no resultado final. O problema é que ele está destruindo seus próprios índices enquanto itera através deles, alterando o valor que
i
realmente está se referindo. Quando estou enfrentando esse problema, gosto de fazer um loop pela matriz para trás, para não ser afetado por minha própria destruição, da seguinte maneira:Espero que isso ajude você a entender bem o que está acontecendo aqui. Se você tiver alguma dúvida, não hesite em deixar um comentário.
fonte
Você está percorrendo a mesma matriz em que o índice é alterado depois que você remove o item da matriz. Abaixo está o exemplo em que você pode percorrer as opções sem índice e removê-lo da matriz.
Aqui está o violino
fonte