Уроки по веб-разработке

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

Как и всё остальное в JavaScript, удаление элемента из массива можно произвести несколькими способами. Для начала рассмотрим базовые возможности, а затем более сложные варианты.

Перед началом этого поста рекомендую вам ознакомиться с методами поиска по массиву, т.к. они будут использоваться в этом посте.

Удаление элемента с помощью метода splice()

Первый вариант, который мы рассмотрим будет с использованием метода splice(). Он принимает три параметра и изменяет исходный массив.

Первым параметром мы указываем индекс элемента в массиве, который мы хотим удалить. Вторым параметром мы указываем сколько элементов начиная с этого индекса мы удаляем. Третий параметр нам не нужен, т.к. он указывается для добавления элементов к массиву.

Если вы не знаете индекс элемента в массиве, мы можем его определить с помощью метода indexOf()

const arr = [0, 1, 2, 3, 4, 5];

const index = arr.indexOf(2);

if (index !== -1) {
    arr.splice(index, 1);
}

console.log(arr); // [0, 1, 3, 4, 5];

Метод indexOf — возвращает нам индекс искомого элемента в массиве, или -1, если такой элемент не найден. Для этого мы делаем проверку index !== -1.

В случае, если у вас есть массив объектов, а не просто массив с элементами, чтобы найти индекс нужного элемента, вы можете также воспользоваться методом findIndex(). Более подробно о поиске элементов в массиве можно ознакомиться по ссылке.

Удаление первого и последнего элемента в массиве

Для удаления последнего элемента из массива мы можем использовать метод pop(), который затем вернет нам удаляемый элемент. Для пустого массива данный метод вернет undefined

const arr = [0, 1, 2, 3, 4, 5];

const removedEl = arr.pop();

console.log(arr); // [0, 1, 2, 3, 4]
console.log(removedEl); // 5

Тут как мне кажется всё просто. Также мы можем использовать метод splice для удаления последнего элемента:

const arr = [0, 1, 2, 3, 4, 5];

// Индекс последнего элемента вычисляем через его длину
// Т.к. порядок элементов начинается с 0, 
// нам нужно от длинны отнять единицу для получения индекса последнего элемента.
const lastEl = arr.length - 1;

arr.splice(lastEl);

console.log(arr); // [0, 1, 2, 3, 4]

Удалить первый элемент массива еще более просто. Для этого мы также можем использовать метод splice()

const arr = [0, 1, 2, 3, 4, 5];
arr.splice(0, 1); // где 0 - это индекс первого элемента в массиве

Но также мы можем использовать метод shift() — он извлечет первый элемент в массиве и вернет его в нашу переменную, т.е. это аналог метода pop() для последнего элемента массива.

const arr = [0, 1, 2, 3, 4, 5];

const removedEl = arr.shift();

console.log(arr); // [1, 2, 3, 4, 5]
console.log(removedEl); // 0

Удаление элемента по условию

Другой вариант это использование метода filter(), он является более сложным, но и дает возможность применять условия для фильтрации — какие элементы попадут в новый массив, а какие нет.

const arr = [0, 1, 2, 3, 4, 5];

// В новый массив не будет возвращен элемент, который равен 2
const newArr = arr.filter(el => el !== 2);
console.log(newArr); // [0, 1, 3, 4, 5]

// В новый массив будут возвращены числа кратные 2
const multipleOfTwo = arr.filter(el => (el % 2) === 0);
console.log(multipleOfTwo); // [0, 2, 4]

// Получим элементы, которые больше или равны 2 и меньше или равны 4
const newArr2 = arr.filter(el => el >= 2 && el <= 4);
console.log(newArr2); // [2, 3, 4]

Подробнее про метод JS filter() можете прочитать в этом посте.

Функция для удаления элементов из массива

Если в вашем приложении вам часто требуется удалять элемент из массива, вы можете написать функцию и расширить ее при необходимости с заданием каких-либо дополнительных условий.

const removeArrEl = (arr, value) => {
  return arr.filter(el => el !== value);
}

// Передадим массив чисел и удалим оттуда 2
console.log(removeArrEl([1,2,3,4], 2)); // [1, 3, 4]

Как удалить дубли в массиве?

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

const arr = [2, 'John', 57, -1, 2, 'Smith', 'John'];

const uniqArr = [...new Set(arr)];

console.log(uniqArr); // [2, 'John', 57, -1, 'Smith']

Второй способ. При помощи метода filter() мы проходимся по нашему массиву и смотрим если ли в данном массиве этот элемент:

const uniqArray = arr.filter((item, index) => {
  return index === arr.indexOf(item);
});

console.log(uniqArray); // [2, 'John', 57, -1, 'Smith']

Третий способ. При помощи метода reduce():

const uniqArray = arr.reduce((uniq, item, index) => {
  return uniq.includes(item) ? uniq : [...uniq, item];
}, []);

console.log(uniqArray); // [2, 'John', 57, -1, 'Smith']

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

С обычными массивами мы разобрались, теперь давайте рассмотрим как удалить элемент массива, если это массив объектов. В посте, который я упоминал выше, есть раздел как выполнить поиск по массиву с объектами:

const arr = [
    { name: 'Ben', age: 21 },
    { name: 'Clif', age: 22 },
    { name: 'Eric', age: 18 },
    { name: 'Anna', age: 27 },
];

const index = arr.findIndex(item => item.name === 'Anna');
arr.splice(index, 1);

console.log(arr); // остается три элемента

Также мы можем использовать метод filter() и получить новый массив с уже удаленным объектом

const newArr = arr.filter(item => item.name !== 'Anna');

console.log(newArr);

Разница в том, что мы получаем новый массив и при этом будут удалены все объекты с name === 'Anna'