lodash позволяет мне проверять членство основных типов данных с помощью includes
:
_.includes([1, 2, 3], 2)
> true
Но следующее не работает:
_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false
Это сбивает меня с толку, потому что следующие методы, которые ищут в коллекции, кажется, делают хорошо:
_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
Что я делаю не так? Как проверить членство объекта в коллекции с помощью includes
?
изменить: вопрос был изначально для для lodash версии 2.4.1, обновлен для lodash 4.0.0
javascript
functional-programming
lodash
Conrad.Dean
источник
источник
_.contains
был удален в lodash v4 - используйте_.includes
вместо этогоcontains
псевдоним. ЯОтветы:
includes
(Прежнее названиеcontains
иinclude
) метод сравнивает объекты по ссылке (или , точнее, с===
). Поскольку два литерала объекта{"b": 2}
в вашем примере представляют разные экземпляры, они не равны. Примечание:Однако это будет работать, потому что есть только один экземпляр
{"b": 2}
:С другой стороны, методы
where
(устаревшие в v4) иfind
методы сравнивают объекты по их свойствам, поэтому им не требуется равенство ссылок. В качестве альтернативыincludes
вы можете попробоватьsome
(также с псевдонимомany
):источник
Дополняя ответ на
p.s.w.g
, вот три способа достижения этой цели использованияlodash
4.17.5
, без использования_.includes()
:Допустим, вы хотите добавить объект
entry
в массив объектовnumbers
, только если онentry
еще не существует.Если вы хотите вернуть a
Boolean
, в первом случае вы можете проверить возвращаемый индекс:источник