lodash lar meg sjekke medlemskap av grunnleggende datatyper med includes
:
_.includes([1, 2, 3], 2)
> true
Men følgende fungerer ikke:
_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false
Dette forvirrer meg fordi følgende metoder som søker gjennom en samling, ser ut til å fungere helt fint:
_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
Hva er det jeg gjør feil? Hvordan sjekker jeg om et objekt tilhører en samling med includes
?
edit: spørsmålet var opprinnelig for lodash versjon 2.4.1, oppdatert for lodash 4.0.0
Metoden includes
(tidligere kalt contains
og include
) sammenligner objekter med referanse (eller mer presist, med ===
). Fordi de to objektene i {"b": 2}
i eksempelet ditt representerer forskjellige forekomster, er de ikke like. Legg merke til dette:
({"b": 2} === {"b": 2})
> false
Dette vil imidlertid fungere fordi det bare finnes én forekomst av {"b": 2}
:
var a = {"a": 1}, b = {"b": 2};
_.includes([a, b], b);
> true
På den annen side sammenligner metodene where
(utgått i v4) og find
objekter etter egenskapene deres, så de krever ikke referanselikhet. Som et alternativ til includes
kan du prøve some
(også kalt any
):
_.some([{"a": 1}, {"b": 2}], {"b": 2})
> true
I tillegg til svaret fra p.s.w.g
, her er tre andre måter å oppnå dette på ved hjelp av lodash
4.17.5
, uten å bruke _.includes()
:
La oss si at du vil legge til objektet entry
i en matrise av objekter numbers
, bare hvis entry
ikke allerede eksisterer.
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}]
Hvis du vil returnere en Boolean
, kan du i det første tilfellet sjekke indeksen som returneres:
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true