lodash lässt mich die Zugehörigkeit zu grundlegenden Datentypen mit includes
überprüfen:
_.includes([1, 2, 3], 2)
> true
Aber das Folgende funktioniert nicht:
_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false
Das verwirrt mich, denn die folgenden Methoden, die eine Sammlung durchsuchen, scheinen gut zu funktionieren:
_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
Was mache ich falsch? Wie prüfe ich die Zugehörigkeit eines Objekts zu einer Sammlung mit includes
?
edit: Frage war ursprünglich für lodash Version 2.4.1, aktualisiert für lodash 4.0.0
Die Methode includes
(früher contains
und include
genannt) vergleicht Objekte anhand von Referenzen (oder genauer gesagt mit ===
). Da die beiden Objektliterale von {"b": 2}
in Ihrem Beispiel unterschiedliche Instanzen darstellen, sind sie nicht gleich. Beachte:
({"b": 2} === {"b": 2})
> false
Dies funktioniert jedoch, weil es nur eine Instanz von {"b": 2}
gibt:
var a = {"a": 1}, b = {"b": 2};
_.includes([a, b], b);
> true
Andererseits vergleichen die Methoden where
(in v4 veraltet) und find
Objekte anhand ihrer Eigenschaften, so dass sie keine Referenzgleichheit erfordern. Als Alternative zu includes
können Sie auch some
(auch als any
bezeichnet) verwenden:
_.some([{"a": 1}, {"b": 2}], {"b": 2})
> true
Ergänzend zur Antwort von p.s.w.g
, hier drei weitere Möglichkeiten, dies mit lodash
4.17.5
zu erreichen, ohne _.includes()
zu verwenden:
Angenommen, Sie wollen das Objekt Eintrag
zu einem Array von Objekten Zahlen
hinzufügen, nur wenn Eintrag
noch nicht existiert.
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 ein Boolean
zurückgeben wollen, können Sie im ersten Fall den Index überprüfen, der zurückgegeben wird:
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true