How do I use the includes method in lodash to check if an object is in the collection?
The includes
(formerly called contains
and include
) method compares objects by reference (or more precisely, with ===
). Because the two object literals of {"b": 2}
in your example represent different instances, they are not equal. Notice:
({"b": 2} === {"b": 2})> false
However, this will work because there is only one instance of {"b": 2}
:
var a = {"a": 1}, b = {"b": 2};_.includes([a, b], b);> true
On the other hand, the where
(deprecated in v4) and find
methods compare objects by their properties, so they don't require reference equality. As an alternative to includes
, you might want to try some
(also aliased as any
):
_.some([{"a": 1}, {"b": 2}], {"b": 2})> true
Supplementing the answer by p.s.w.g
, here are three other ways of achieving this using lodash
4.17.5
, without using _.includes()
:
Say you want to add object entry
to an array of objects numbers
, only if entry
does not exist already.
let numbers = [ { to: 1, from: 2 }, { to: 3, from: 4 }, { to: 5, from: 6 }, { to: 7, from: 8 }, { to: 1, from: 2 } // intentionally added duplicate];let entry = { to: 1, from: 2 };/* * 1. This will return the *index of the first* element that matches: */_.findIndex(numbers, (o) => { return _.isMatch(o, entry) });// output: 0/* * 2. This will return the entry that matches. Even if the entry exists * multiple time, it is only returned once. */_.find(numbers, (o) => { return _.isMatch(o, entry) });// output: {to: 1, from: 2}/* * 3. This will return an array of objects containing all the matches. * If an entry exists multiple times, if is returned multiple times. */_.filter(numbers, _.matches(entry));// output: [{to: 1, from: 2}, {to: 1, from: 2}]
If you want to return a Boolean
, in the first case, you can check the index that is being returned:
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;// output: true
You could use find
to solve your problem
const data = [{"a": 1}, {"b": 2}]const item = {"b": 2}find(data, item)// > true