Wie verwende ich die Includes-Methode in lodash, um zu überprüfen, ob sich ein Objekt in der Sammlung befindet?

146

Mit lodash kann ich die Mitgliedschaft in grundlegenden Datentypen überprüfen mit includes:

_.includes([1, 2, 3], 2)
> true

Aber folgendes funktioniert nicht:

_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false

Das verwirrt mich, weil die folgenden Methoden, die eine Sammlung durchsuchen, gut funktionieren:

_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}

Was mache ich falsch? Wie überprüfe ich die Mitgliedschaft eines Objekts in einer Sammlung mit includes?

edit: frage war ursprünglich für lodash version 2.4.1, aktualisiert für lodash 4.0.0

Conrad.Dean
quelle
7
_.containswurde in lodash v4 entfernt - _.includesstattdessen verwenden
Billy Moon
@ BillyMoon woops! Ja, Sie haben Recht, lodash v4.0.0 (veröffentlicht am 12.01.2016) entfernt den containsAlias. Ich werde dies aktualisieren
Conrad.Dean

Antworten:

222

Die includes(früher als containsund bezeichnete include) Methode vergleicht Objekte anhand von Referenzen (oder genauer gesagt mit ===). Da die beiden Objektliterale {"b": 2}in Ihrem Beispiel unterschiedliche Instanzen darstellen, sind sie nicht gleich. Beachten:

({"b": 2} === {"b": 2})
> false

Dies funktioniert jedoch, da es nur eine Instanz von {"b": 2}:

var a = {"a": 1}, b = {"b": 2};
_.includes([a, b], b);
> true

Auf der anderen Seite vergleichen die where(in Version 4 veralteten) und findMethoden Objekte anhand ihrer Eigenschaften, sodass sie keine Referenzgleichheit erfordern. Alternativ includeskönnen Sie someFolgendes versuchen (auch als Alias ​​bezeichnet any):

_.some([{"a": 1}, {"b": 2}], {"b": 2})
> true
pswg
quelle
12

Ergänzend zur Antwort p.s.w.ggibt es drei weitere Möglichkeiten, dies zu erreichen lodash 4.17.5, ohne _.includes() :

Angenommen, Sie möchten entryeinem Array von Objekten numbersnur dann Objekte hinzufügen , wenn entrydies noch nicht vorhanden ist.

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}]

Wenn Sie a zurückgeben möchten Boolean, können Sie im ersten Fall den zurückgegebenen Index überprüfen:

_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true
Mihai
quelle