#4 Методы without, remove, reject в lodash

poster
В этом уроке мы разберем как использовать методы without, remove, reject в lodash
Понравилось? Поделитесь с друзьями!
Понравилось?
Поделитесь с друзьями!
Комментарии
Текст видео

Всем привет. Мы продолжаем изучать лодаш. Сегодня мы поговорим о таких методах как without, remove и reject. Метод without не работает так же как map, each или filter.

_.without([1,2,3], 1, 2)

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

_.without([{id:1, name:"1"}, {id:2, name: "2"}], {id:1, name:"1"})

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

И еще иногда разработчики очень любят писать вот такой код и тоже не понимают почему он не работает. В основном потому что не читают документацию.

_.without([{id:1, name:"1"}], function (item) {
  return item.id;
})

Если мы думаем, что метод without работает так же, как filter, то да, тогда бы этот код работал и он бы удалил у нас из массива все елементы с id: 1. Но, как мы видим так этот метод не работает, потому что without просто не принимает вторым аргументом функцию.

Что же делать если мы хотим удалить данные из массива по какому-то условию? Для этого есть метод remove. Вот он как раз работает ожидаемо. Первый аргумент массив, а второй итератор

Создадим массив а и вызовем функцию remove на этот массив.

a = [{id:1, name:"1"}, {id:2, name: "2"}]
_.remove(a, function (item) {
  return item.id === 2;
})

Вроде бы все хорошо, но есть одно большое НО. Remove является мутабельным методом. Если мы посмотрим на переменную а, то мы увидим, что она изменилась. Т.е. метод remove не возвращает новый массив как filter или map, а он изменяет исходный массив. И с этим всегда нужно быть внимательным.

Что же делать если мы не хотим менять исходный массив, а хотим получить новый? Нам ничто не мешает использовать уже существующий метод фильтр

_.filter([{id:1, name:"1"}, {id:2, name: "2"}], function (item) {
  return item.2 !== 2;
})

Мы можем просто указать условие с отрицанием и тем самым получим все елементы, которые мы хотим оставить в массиве. Как мы видим в результате мы получили массив с одним елементом, и елемент с id: 2 здесь уже не участвует. Это самый просто способ отфильтровать не нужные нам елементы.

Ну а другой вариант, это использовать метод reject. Он как раз и является методом, обратным методу filter. Он работает абсолютно так же как в filter, но возвращает массив елементов, которые не выполняют условие.

_.reject([{id:1, name:"1"}, {id:2, name: "2"}], function (item) {
  return item.id == 2;
})

Здесь reject выполнится и удалит елементы у которых id равно 2. Когда вы вызываете reject, вы должны помнить, что в условии указываются те елементы, которые должны быть удалены.

Также вы можете использовать укороченную запись.

_.reject([{id:1, name:"1"}, {id:2, name: "2"}], {id: 2})

Метод remove я советую использовать как можно реже, так как он меняет исходные данные. Метод without тоже лучше не использовать так как он не достаточно гибкий.

На сегодня все, а в следующем уроке мы разберем методы reduce и every.

Только зарегистрированные пользователи могут оставлять комментарии.  Войдите, пожалуйста.
vladislavicus
10 месяцев назад
Спасибо за видео!
monsterlessons
10 месяцев назад
На здоровье)