Как удалить элемент из массива
По значению — найдите индекс и вырежьте элемент splice:
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 возвращает новый массив без лишних элементов, исходный не меняется:
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() |
элемент с индексом i | arr.splice(i, 1) |
несколько подряд с индекса i | arr.splice(i, n) |
| все элементы | arr.length = 0 или arr = [] (если объявлен через let) |
pop, shift и splice возвращают удалённое: const last = arr.pop().
Удалить, не меняя исходный массив
Иногда исходный массив трогать нельзя — например, он хранит состояние страницы, и изменения должны идти через новый массив. Тогда элемент с индексом i убирают через filter по индексу:
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
const nums = [1, 2, 3];
delete nums[1];
console.log(nums);
console.log(nums.length);[ 1, <1 empty item>, 3 ]
3delete убирает значение, но не сдвигает остальные элементы: остаётся «дыра», а длина массива прежняя. Для массивов delete не используют.
Удаление в цикле
Если удалять элементы через splice в цикле от начала к концу, индексы сдвигаются, и элемент сразу за удалённым пропускается. Либо идите с конца:
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).