.options
Коллекция (к сожалению) в прямом эфире , так что итерация элементы живой коллекции в один-на-один и .remove
ИНГ каждый приведет к каждой нечетной держится. (Например, право , когда вы удалите первый элемент, то [0]
й элемент коллекции сразу становится следующий элемент в коллекции - что раньше [1]
станет [0]
(а затем , как только вы переходите к следующему индексу в [1]
, тем новый пункт в положении 0 не будет повторяться)
Используйте document.querySelectorAll
вместо этого, который возвращает коллекцию, которая является статической:
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>
Вы также можете распространяться в (статический) массив перед удалением элементов:
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>
Другой вариант , который как раз случается к работе , потому что коллекция живой (но , вероятно , не следует использовать, так как это не интуитивно):
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
источник
.options
Это не массив, который является источником проблемы - скорее, что это HTMLCollection, который находится под напряжением. Если бы это был массив, он был бы статичным, и не было бы никаких проблем.HTMLOptionsCollection
Объект действует в этом контексте как массив.Я вижу, что ваша главная цель - понять процесс, который вызывает это, поэтому это должно проиллюстрировать проблему для вас:
Этот цикл проходит точно такой же тип процесса, что и ваш цикл "for .. of", чтобы оставить вас с дополнениями в конечном результате. Проблема состоит в том, что он разрушает свои собственные индексы при их итерации, тем самым изменяя значение, на
i
которое действительно ссылаются. Когда я сталкиваюсь с этой проблемой, мне нравится перебирать массив задом наперед, чтобы на меня не повлияло мое собственное уничтожение, например:Я надеюсь, что это поможет вам полностью понять, что здесь происходит. Если у вас есть какие-либо вопросы, не стесняйтесь оставить мне комментарий.
источник
Вы перебираете тот же массив, где изменяется индекс после удаления элемента из массива. Ниже приведен пример, где вы можете перебирать опции без индекса и удалять его из массива.
Вот скрипка
источник