У меня есть следующее для цикла, и когда я использую splice()
для удаления элемента, я получаю, что «секунд» не определено. Я мог бы проверить, не определено ли оно, но я чувствую, что, возможно, есть более элегантный способ сделать это. Желание состоит в том, чтобы просто удалить элемент и продолжить.
for (i = 0, len = Auction.auctions.length; i < len; i++) {
auction = Auction.auctions[i];
Auction.auctions[i]['seconds'] --;
if (auction.seconds < 0) {
Auction.auctions.splice(i, 1);
}
}
javascript
loops
DZM
источник
источник
Auction.auctions[i]['seconds']--
вместоauction.seconds--
?Ответы:
Массив переиндексируется, когда вы делаете a
.splice()
, что означает, что вы пропустите индекс, когда он удален, и ваш кеш.length
устарел.Чтобы это исправить, вам нужно либо уменьшить
i
после a.splice()
, либо просто выполнить итерацию в обратном порядке ...Таким образом, переиндексация не влияет на следующий элемент в итерации, поскольку индексация затрагивает только элементы от текущей точки до конца массива, а следующий элемент в итерации ниже текущей точки.
источник
Это довольно распространенная проблема. Решение состоит в том, чтобы вернуться назад:
Неважно, если вы вытолкаете их с конца, потому что индексы будут сохраняться при обратном движении.
источник
Пересчитывайте длину каждый раз в цикле, а не только в самом начале, например:
Таким образом, вы не будете выходить за пределы.
РЕДАКТИРОВАТЬ: добавлено уменьшение в операторе if.
источник
Хотя ваш вопрос касается удаления элементов из массива, над которым выполняется итерация, а не эффективного удаления элементов (в дополнение к какой-либо другой обработке), я думаю, что следует пересмотреть это, если в подобной ситуации.
Алгоритмическая сложность этого подхода заключается
O(n^2)
в том, что функция сплайсинга и цикл for выполняют итерацию по массиву (функция сплайсинга смещает все элементы массива в худшем случае). Вместо этого вы можете просто вставить требуемые элементы в новый массив, а затем просто назначить этот массив требуемой переменной (которая только что была повторена).Начиная с ES2015 мы можем использовать,
Array.prototype.filter
чтобы уместить все это в одну строку:источник
источник
Если вы используете ES6 + - почему бы просто не использовать метод Array.filter?
Обратите внимание, что изменение элемента массива во время итерации фильтра работает только для объектов и не будет работать для массива примитивных значений.
источник
Еще одно простое решение для переваривания элементов массива один раз:
источник
Вот еще один пример правильного использования сращивания. Этот пример собирается удалить «атрибут» из «массива».
источник
Каждому человеку, который ответил на этот самый базовый вопрос с кодом, содержащим splice () в цикле, который имеет время выполнения O (n 2 ), или который проголосовал за такой ответ, в течение семи лет с момента публикации этого вопроса: вам следует стыдиться .
Вот простое линейное временное решение этой простой линейной временной задачи.
Когда я запускаю этот фрагмент с n = 1 миллионом, каждый вызов filterInPlace () занимает от 0,013 до 0,016 секунды. Квадратичное решение (например, принятый ответ) займет миллион раз, или около того.
Обратите внимание, что это изменяет исходный массив на месте, а не создает новый массив; делать это на месте, как это, может быть выгодно, например, в случае, если массив является узким местом программы в памяти; в этом случае вы не хотите создавать другой массив того же размера, даже временно.
источник
Array.splice(i,1)
будет ли каждый раз создавать новый экземпляр массива. Мне очень стыдно.В этой теме уже есть много замечательных ответов. Однако я хотел поделиться своим опытом, когда попытался решить «удалить n-й элемент из массива» в контексте ES5.
Массивы JavaScript имеют разные методы для добавления / удаления элементов из начала или конца. Эти:
По сути, ни один из вышеперечисленных методов не может быть использован напрямую для удаления n-го элемента из массива.
Это в основном оставляет нам только один метод массива
Array.splice
для выполнения удаления n-го элемента (есть и другие вещи, которые вы могли бы сделать с этими методами, но в контексте этого вопроса я сосредоточился на удалении элементов):Вот код, скопированный из оригинального ответа (с комментариями):
Еще один заслуживающий внимания метод
Array.slice
. Однако тип возвращаемого значения этого метода - удаленные элементы. Также это не изменяет исходный массив. Изменен фрагмент кода следующим образом:Сказав это, мы все еще можем использовать
Array.slice
для удаления n-го элемента, как показано ниже. Однако это намного больше кода (следовательно, неэффективно)источник
Попробуйте передать массив в newArray при цикле:
источник
Два примера, которые работают:
источник
Дайте это попробовать
источник
источник
Вы можете просто просмотреть и использовать
shift()
источник