Найдите index
элемент массива, который вы хотите удалить indexOf
, а затем удалите этот индекс splice
.
Метод splice () изменяет содержимое массива, удаляя существующие элементы и / или добавляя новые элементы.
const array = [2, 5, 9];
console.log(array);
const index = array.indexOf(5);
if (index > -1) {
array.splice(index, 1);
}
// array = [2, 9]
console.log(array);
Второй параметр splice
- это количество удаляемых элементов. Обратите внимание, что splice
изменяет массив на месте и возвращает новый массив, содержащий элементы, которые были удалены.
Для полноты здесь приведены функции. Первая функция удаляет только одно вхождение (т.е. удаляет первое совпадение 5
с [2,5,9,1,5,8,5]
), а вторая функция удаляет все вхождения:
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
function removeItemAll(arr, value) {
var i = 0;
while (i < arr.length) {
if(arr[i] === value) {
arr.splice(i, 1);
} else {
++i;
}
}
return arr;
}
array.indexOf(testValue)
в пустом массиве будет -1, и если вы проверяете это, то нет соединения. Может быть, ответ изменился с тех пор.Я не знаю, как вы ожидаете
array.remove(int)
себя вести. Есть три варианта, о которых вы можете подумать.Чтобы удалить элемент массива по индексу
i
:Если вы хотите удалить каждый элемент со значением
number
из массива:Если вы просто хотите, чтобы элемент с индексом
i
больше не существовал, но вы не хотите, чтобы индексы других элементов изменились:источник
delete
неправильный способ удалить элемент из массива!array.hasOwnProperty(i)
возвращалсяfalse
и возвращал элемент в этой позицииundefined
. Но я признаю, что это не очень распространенная вещь, которую хочется делать.delete
не обновляет длину массива и не стирает элемент, а только заменяет его специальным значениемundefined
.undefined
: он удаляет как индекс, так и значение из массива, то есть послеdelete array[0]
,"0" in array
возвращает false.delete
делает, понять, почему это не работает так, как они ожидают.Отредактировано в октябре 2016
В этом примере кода я использую функцию «array.filter (...)» для удаления ненужных элементов из массива. Эта функция не меняет исходный массив и создает новый. Если ваш браузер не поддерживает эту функцию (например, Internet Explorer до версии 9 или Firefox до версии 1.5), рассмотрите возможность использования фильтра polyfill из Mozilla .
Удаление элемента (код ECMA-262 Edition 5, также известный как старый стиль JavaScript)
Удаление элемента (код ECMAScript 6)
ВАЖНО ECMAScript 6 "() => {}" Синтаксис функции стрелок вообще не поддерживается в Internet Explorer, Chrome до 45 версии, Firefox до 22 версии и Safari до 10 версии. Для использования синтаксиса ECMAScript 6 в старых браузерах вы можете использовать BabelJS .
Удаление нескольких элементов (код ECMAScript 7)
Дополнительным преимуществом этого метода является то, что вы можете удалить несколько элементов
ВАЖНО! Функция "array.includes (...)" вообще не поддерживается в Internet Explorer, Chrome до 47 версии, Firefox до 43 версии, Safari до 9 версии и Edge до 14 версии, так что здесь есть полифил из Mozilla .
Удаление нескольких элементов (возможно, в будущем)
Если предложение «Синтаксис This-Binding» будет принято, вы сможете сделать это:
Попробуйте сами в BabelJS :)
Ссылка
источник
filter
должно быть намного медленнее для большого массива, хотя?filter
может иметь более низкую производительность, но это более безопасный и лучший код. Кроме того, вы можете фильтровать по индексу, указав второй аргумент в лямбду:arr.filter((x,i)=>i!==2)
Это зависит от того, хотите ли вы оставить пустое место или нет.
Если вам нужен пустой слот, удаление возможно:
Если вы этого не сделаете, вы должны использовать сращивания метод:
И если вам нужно значение этого элемента, вы можете просто сохранить элемент возвращаемого массива:
Если вы хотите сделать это в некотором порядке, вы можете использовать
array.pop()
для последнего илиarray.shift()
для первого (и оба возвращают значение элемента тоже).И если вы не знаете индекс предмета, вы можете использовать его
array.indexOf(item)
для получения (в,if()
чтобы получить один элемент или в,while()
чтобы получить их все).array.indexOf(item)
возвращает индекс или -1, если не найден.источник
delete
неправильный способ удалить элемент из массива !!array[index] = undefined;
. Использованиеdelete
уничтожит оптимизацию.У друга были проблемы в Internet Explorer 8 и он показал мне, что он сделал. Я сказал ему, что это неправильно, и он сказал мне, что получил ответ здесь. Текущий верхний ответ не будет работать во всех браузерах (например, Internet Explorer 8), и он будет удалять только первое вхождение элемента.
Удалить ВСЕ экземпляры из массива
Он перебирает массив в обратном направлении (поскольку индексы и длина изменяются при удалении элементов) и удаляет элемент, если он найден. Работает во всех браузерах.
источник
i = arr.length -1
илиi--
делает его таким же, как индекс max.arr.length
это просто начальное значение дляi
.i--
всегда будет правдивым (и уменьшаться на 1 при каждой операции цикла) до тех пор, пока оно не0
станет равным (ложное значение), и цикл затем остановится.arr.filter(function (el) { return el !== item })
, избегая необходимости многократного изменения массива. Это потребляет немного больше памяти, но работает намного эффективнее, так как требуется меньше работы.Есть два основных подхода:
сплайс () :
anArray.splice(index, 1);
удалить :
delete anArray[index];
Будьте осторожны, когда вы используете delete для массива. Это хорошо для удаления атрибутов объектов, но не так хорошо для массивов. Лучше использовать
splice
для массивов.Имейте в виду, что когда вы используете
delete
массив, вы можете получить неверные результатыanArray.length
. Другими словами,delete
удалит элемент, но не обновит значение свойства length.Вы также можете ожидать, что у вас будут дыры в индексах после использования delete, например, вы можете получить индексы 1, 3, 4, 8, 9 и 11 и длину, как это было до использования delete. В этом случае все проиндексированные
for
циклы будут аварийно завершены, поскольку индексы больше не являются последовательными.Если вы вынуждены использовать
delete
по какой-то причине, то вы должны использоватьfor each
циклы, когда вам нужно перебрать массивы. На самом деле, всегда избегайте использования индексированныхfor
циклов, если это возможно. Таким образом, код будет более устойчивым и менее подверженным проблемам с индексами.источник
источник
for in
массив, у вас уже есть проблема.for in
на массивах, у вас уже есть большие проблемы.Там нет необходимости использовать
indexOf
илиsplice
. Однако он работает лучше, если вы хотите удалить только одно вхождение элемента.Найти и переместить (переместить):
Используйте
indexOf
иsplice
(indexof):Использовать только
splice
(соединение):Время выполнения на nodejs для массива с 1000 элементов (в среднем более 10000 запусков):
indexof примерно в 10 раз медленнее, чем двигаться . Даже если его улучшить, удалив вызов
indexOf
в сплайсинге, он работает намного хуже, чем перемещение .источник
Это обеспечивает предикат вместо значения.
ПРИМЕЧАНИЕ: он обновит данный массив и вернет затронутые строки.
Применение
Определение
источник
Вы можете сделать это легко с помощью метода фильтра :
Это удаляет все элементы из массива, а также работает быстрее, чем комбинация
slice
иindexOf
.источник
Джон Резиг опубликовал хорошую реализацию :
Если вы не хотите расширять глобальный объект, вместо этого вы можете сделать что-то вроде следующего:
Но главная причина, по которой я публикую это, состоит в том, чтобы предостеречь пользователей от альтернативной реализации, предложенной в комментариях на этой странице (14 декабря 2007 г.):
Поначалу кажется, что это хорошо работает, но через болезненный процесс, который я обнаружил, он терпит неудачу при попытке удалить второй или последний элемент в массиве. Например, если у вас есть массив из 10 элементов, и вы пытаетесь удалить 9-й элемент следующим образом:
Вы получите массив из 8 элементов. Не знаю почему, но я подтвердил, что оригинальная реализация Джона не имеет этой проблемы.
источник
Object.prototype.hasOwnProperty
всегда ¬¬Underscore.js можно использовать для решения проблем с несколькими браузерами. Он использует встроенные методы браузера, если таковые имеются. Если они отсутствуют, как в случае более старых версий Internet Explorer, он использует свои собственные пользовательские методы.
Простой пример удаления элементов из массива (с сайта):
источник
Вы можете использовать ES6. Например, чтобы удалить значение «3» в этом случае:
Вывод :
источник
Если вы хотите новый массив с удаленными удаленными позициями, вы всегда можете удалить определенный элемент и отфильтровать массив. Может потребоваться расширение объекта массива для браузеров, которые не реализуют метод фильтра, но в долгосрочной перспективе это проще, так как все, что вы делаете, это:
Это должно отобразить
[1, 2, 3, 4, 6]
.источник
Проверьте этот код. Это работает в любом крупном браузере .
Вызвать эту функцию
источник
for in
-loop и того факта, что сценарий можно было остановить раньше, возвращая результат из цикла напрямую. Прогнозы разумны;)for( i = 0; i < arr.length; i++ )
был бы лучшим подходом, поскольку он сохраняет точные индексы в зависимости от того, в каком порядке браузер решит хранить элементы (сfor in
). Это также позволяет вам получить индекс массива значения, если вам это нужно.Вы можете использовать lodash _.pull (массив мутирования), _.pullAt (массив мутирования) или _.without (не мутирует массив),
источник
ES6 & без мутации: (октябрь 2016 г.)
источник
filter
тогда?array.filter((_, index) => index !== removedIndex);
,Удаление определенного элемента / строки из массива может быть сделано в одну строку:
где:
theArray : массив, из которого вы хотите удалить что-то конкретное
stringToRemoveFromArray : строка, которую вы хотите удалить, а 1 - это количество элементов, которые вы хотите удалить.
ПРИМЕЧАНИЕ . Если строка «stringToRemoveFromArray» не находится в массиве, это приведет к удалению последнего элемента массива.
Хорошей практикой является проверка наличия элемента в вашем массиве перед его удалением.
Если у вас есть доступ к более новым версиям Ecmascript на компьютерах вашего клиента (ВНИМАНИЕ, может не работать на старых станциях):
Где «3» - это значение, которое вы хотите удалить из массива. Массив станет:
['1','2','4','5','6']
источник
"stringToRemoveFromArray"
в массиве не находится ваш, это удалит последний элемент массива.Вот несколько способов удалить элемент из массива с помощью JavaScript .
Все описанные методы не изменяют исходный массив , а создают новый.
Если вы знаете индекс предмета
Предположим, у вас есть массив, и вы хотите удалить элемент в позиции
i
.Одним из методов является использование
slice()
:slice()
создает новый массив с индексами, которые он получает. Мы просто создаем новый массив от начала до индекса, который мы хотим удалить, и объединяем другой массив с первой позиции, следующей за той, которую мы удалили, до конца массива.Если вы знаете значение
В этом случае один хороший вариант - использовать
filter()
, который предлагает более декларативный подход:Это использует функции стрелки ES6. Вы можете использовать традиционные функции для поддержки старых браузеров:
или вы можете использовать Babel и перенести код ES6 обратно в ES5, чтобы сделать его более удобным для старых браузеров, и в то же время написать современный JavaScript в своем коде.
Удаление нескольких предметов
Что если вместо одного элемента вы хотите удалить много элементов?
Давайте найдем самое простое решение.
По индексу
Вы можете просто создать функцию и удалить элементы последовательно:
По значению
Вы можете искать включение внутри функции обратного вызова:
Избегайте мутации исходного массива
splice()
(не путать сslice()
) изменяет исходный массив, и его следует избегать.(первоначально размещено на https://flaviocopes.com/how-to-remove-item-from-array/ )
источник
ОК, например, у вас есть массив ниже:
И мы хотим удалить номер 4. Вы можете просто использовать следующий код:
Если вы повторно используете эту функцию, вы пишете функцию многократного использования, которая будет прикреплена к встроенной функции массива, как показано ниже:
Но как насчет того, чтобы вместо этого у вас был массив ниже с несколькими [5] в массиве?
Нам нужен цикл, чтобы проверить их все, но более простой и эффективный способ - использовать встроенные функции JavaScript, поэтому мы пишем функцию, которая использует фильтр, как показано ниже:
Также есть сторонние библиотеки, которые помогут вам в этом, например, Lodash или Underscore. Для получения дополнительной информации смотрите lodash _.pull, _.pullAt или _.without.
источник
this.splice(num.indexOf(x), 1);
=>this.splice(this.indexOf(x), 1);
Я довольно новичок в JavaScript и мне нужна эта функциональность. Я просто написал это:
Тогда, когда я хочу использовать это:
Выход - как и ожидалось. ["item1", "item1"]
У вас могут быть другие потребности, чем у меня, поэтому вы можете легко изменить их в соответствии с их потребностями. Я надеюсь, что это помогает кому-то.
источник
Если у вас есть сложные объекты в массиве, вы можете использовать фильтры? В ситуациях, когда $ .inArray или array.splice не так просты в использовании. Особенно если объекты, возможно, мелкие в массиве.
Например, если у вас есть объект с полем Id, и вы хотите удалить объект из массива:
источник
Я хочу ответить на основе ECMAScript 6 . Предположим, у вас есть массив, как показано ниже:
Если вы хотите удалить по специальному индексу вроде
2
, напишите следующий код:Но если вы хотите удалить специальный элемент, например,
3
и не знаете его индекс, сделайте следующее:Подсказка : пожалуйста, используйте функцию стрелки для обратного вызова фильтра, если вы не получите пустой массив.
источник
Обновление: этот метод рекомендуется, только если вы не можете использовать ECMAScript 2015 (ранее известный как ES6). Если вы можете использовать его, другие ответы здесь обеспечивают более аккуратные реализации.
Эта суть здесь решит вашу проблему, а также удалит все вхождения аргумента вместо 1 (или указанного значения).
Применение:
источник
Представление
Сегодня (2019-12-09) я провожу тесты производительности на macOS v10.13.6 (High Sierra) для выбранных решений. Я показываю
delete
(A), но я не использую его по сравнению с другими методами, потому что он оставил пустое место в массиве.Выводы
array.splice
(C) (за исключением Safari для небольших массивов, где он второй раз)array.slice+splice
(H) - самое быстрое неизменное решение для Firefox и Safari;Array.from
(B) самый быстрый в Chromeподробности
В тестах я удаляю средний элемент из массива разными способами. A, C решения на месте. В, D, Е, F, G, Н растворы являются неизменяемыми.
Результаты для массива из 10 элементов
В Chrome
array.splice
(C) - самое быстрое решение на месте.array.filter
(D) , является самым непреложным решением. Самый медленный -array.slice
(F). Вы можете выполнить тест на вашей машине здесь .Результаты для массива с 1.000.000 элементов
В Chrome
array.splice
(C) - самое быстрое решение на месте (delete
(C) очень быстро аналогично - но оно оставило пустую ячейку в массиве (поэтому не выполняет «полное удаление»)).array.slice-splice
(Н) является самым непреложным решением. Самый медленный -array.filter
(D и E). Вы можете выполнить тест на вашей машине здесь .Показать фрагмент кода
Сравнение для браузеров: Chrome v78.0.0, Safari v13.0.4 и Firefox v71.0.0
источник
Вы никогда не должны изменять свой массив. Как это против функционального шаблона программирования. Вы можете создать новый массив без ссылки на массив, для которого вы хотите изменить данные, используя метод ECMAScript 6
filter
;Предположим, вы хотите удалить
5
из массива, вы можете просто сделать это так:Это даст вам новый массив без значения, которое вы хотите удалить. Таким образом, результат будет:
Для дальнейшего понимания вы можете прочитать документацию MDN на Array.filter .
источник
Более современный подход ECMAScript 2015 (ранее известный как Harmony или ES 6). Данный:
Затем:
Уступая:
Вы можете использовать Babel и службу polyfill, чтобы гарантировать, что это хорошо поддерживается во всех браузерах.
источник
.filter
возвращается новый массив, который не совсем совпадает с удалением элемента из того же массива. Преимущество этого подхода заключается в том, что вы можете объединять методы массива вместе. Например:[1,2,3].filter(n => n%2).map(n => n*n) === [ 1, 9 ]
splice
илиslice
.items= items.filter(x=>x!=3)
. Кроме того, ОП не указывал никаких требований к большому набору данных.У вас есть от 1 до 9 в массиве, и вы хотите удалить 5. Используйте следующий код:
Если вы хотите несколько значений. Пример: - 1,7,8
Если вы хотите удалить значение массива в массиве. Пример: [3,4,5]
Включает в себя поддерживаемый браузер по ссылке .
источник
Я знаю, что ответов уже много, но многие из них, кажется, слишком усложняют проблему. Вот простой, рекурсивный способ удаления всех экземпляров ключа - вызывает self, пока индекс не будет найден. Да, он работает только в браузерах
indexOf
, но он прост и может быть легко заполнен.Автономная функция
Метод прототипа
источник
Вы можете сделать обратный цикл, чтобы убедиться, что индексы не испорчены, если имеется несколько экземпляров элемента.
Live Demo
источник