lodash me permet de vérifier l'appartenance des types de données de base avec includes
:
_.includes([1, 2, 3], 2)
> true
Mais ce qui suit ne fonctionne pas:
_.includes([{"a": 1}, {"b": 2}], {"b": 2})
> false
Cela me perturbe car les méthodes suivantes, qui recherchent dans une collection, semblent fonctionner parfaitement:
_.where([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
_.find([{"a": 1}, {"b": 2}], {"b": 2})
> {"b": 2}
Qu'est-ce que je fais de mal ? Comment vérifier l'appartenance d'un objet à une collection avec includes
?
edit: la question était à l'origine pour lodash version 2.4.1, mise à jour pour lodash 4.0.0
La méthode [includes
][1] (anciennement appelée contains
et include
) compare les objets par référence (ou plus précisément, avec ===
). Comme les deux objets littéraux de {"b" : 2}
dans votre exemple représentent des instances différentes, ils ne sont pas égaux. Remarquez:
({"b": 2} === {"b": 2})
> false
Cependant, cela fonctionne car il n'y a qu'une seule instance de {"b" : 2}
:
var a = {"a": 1}, b = {"b": 2};
_.includes([a, b], b);
> true
D'un autre côté, les méthodes [where
][2] (dépréciées dans la v4) et [find
][3] comparent les objets par leurs propriétés, et ne nécessitent donc pas l'égalité des références. Comme alternative à includes
, vous pouvez essayer [some
][4] (également alias any
):
_.some([{"a": 1}, {"b": 2}], {"b": 2})
> true
[1] : https://lodash.com/docs/4.17.4#includes [2] : https://lodash.com/docs/3.10.1#where [3] : https://lodash.com/docs/4.17.4#find [4] : https://lodash.com/docs/4.17.4#some
En complément de la réponse de p.s.w.g
, voici trois autres façons d'y parvenir en utilisant lodash
4.17.5
, sans utiliser _.includes()
:
Disons que vous voulez ajouter l'objet entry
à un tableau d'objets numbers
, seulement si entry
n'existe pas déjà.
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}]
Si vous voulez retourner un Booléen
, dans le premier cas, vous pouvez vérifier l'index qui est retourné:
_.findIndex(numbers, (o) => { return _.isMatch(o, entry) }) > -1;
// output: true