Глиф Учебники

Как удалить элемент из массива

Справочник · JavaScript · 1 минута чтения

По значению — найдите индекс и вырежьте элемент splice:

JavaScript
const fruits = ["яблоко", "груша", "слива", "груша"];

const i = fruits.indexOf("груша");
if (i !== -1) {
  fruits.splice(i, 1);
}
console.log(fruits);
Вывод
[ 'яблоко', 'слива', 'груша' ]

indexOf находит первое совпадение и возвращает его индекс или -1, если значения нет. Проверка i !== -1 обязательна: splice(-1, 1) удалил бы последний элемент. splice(индекс, сколько) удаляет элементы прямо в этом массиве.

Все совпадения сразу — filter

filter возвращает новый массив без лишних элементов, исходный не меняется:

JavaScript
const fruits = ["яблоко", "груша", "слива", "груша"];
const withoutPears = fruits.filter((f) => f !== "груша");

console.log(withoutPears);
console.log(fruits.length);
Вывод
[ 'яблоко', 'слива' ]
4

Так же удаляют объекты по условию: users.filter((u) => u.id !== 7) — все, кроме пользователя с id 7.

Другие случаи

Что удалитьКак
последний элементarr.pop()
первый элементarr.shift()
элемент с индексом iarr.splice(i, 1)
несколько подряд с индекса iarr.splice(i, n)
все элементыarr.length = 0 или arr = [] (если объявлен через let)

pop, shift и splice возвращают удалённое: const last = arr.pop().

Удалить, не меняя исходный массив

Иногда исходный массив трогать нельзя — например, он хранит состояние страницы, и изменения должны идти через новый массив. Тогда элемент с индексом i убирают через filter по индексу:

JavaScript
const letters = ["a", "b", "c", "d"];
const i = 1;

const result = letters.filter((_, index) => index !== i);
console.log(result);
console.log(letters);
Вывод
[ 'a', 'c', 'd' ]
[ 'a', 'b', 'c', 'd' ]

Функция в filter получает вторым аргументом индекс элемента; первый, сам элемент, здесь не нужен, и его по обычаю называют _. В свежих браузерах и в Node.js 20 и новее то же делает метод toSpliced: letters.toSpliced(1, 1).

Почему не delete

JavaScript
const nums = [1, 2, 3];
delete nums[1];

console.log(nums);
console.log(nums.length);
Вывод
[ 1, <1 empty item>, 3 ]
3

delete убирает значение, но не сдвигает остальные элементы: остаётся «дыра», а длина массива прежняя. Для массивов delete не используют.

Удаление в цикле

Если удалять элементы через splice в цикле от начала к концу, индексы сдвигаются, и элемент сразу за удалённым пропускается. Либо идите с конца:

JavaScript
const nums = [1, 2, 2, 3, 2];

for (let i = nums.length - 1; i >= 0; i--) {
  if (nums[i] === 2) {
    nums.splice(i, 1);
  }
}
console.log(nums);
Вывод
[ 1, 3 ]

…либо, что проще, используйте filter: nums = nums.filter((n) => n !== 2) (если nums объявлен через let).