Je veux obtenir l'index de la valeur donnée dans un tableau en utilisant underscore.js.
Voici mon cas
var array = [{'id': 1, 'name': 'xxx'},
{'id': 2, 'name': 'yyy'},
{'id': 3, 'name': 'zzz'}];
var searchValue = {'id': 1, 'name': 'xxx'};
J'ai utilisé le code suivant,
var index = _.indexOf(array, function(data) {
alert(data.toSource()); //For testing purpose
return data === searchValue;
});
Aussi essayé cela aussi
var index = _.indexOf(array, {id: searchValue.id});
Mais c'est returns -1
. Comme il n'entre pas dans cette fonction. Donc, je n'ai pas reçu ce message d'alerte.
Quel est le problème avec mon code .. Quelqu'un peut-il m'aider?
Utilisez ceci à la place:
var array = [{'id': 1, 'name': 'xxx'},
{'id': 2, 'name': 'yyy'},
{'id': 3, 'name': 'zzz'}];
var searchValue = {'id': 1, 'name': 'xxx'},
index = -1;
_.each(array, function(data, idx) {
if (_.isEqual(data, searchValue)) {
index = idx;
return;
}
});
console.log(index); //0
Dans votre extrait data === searchValue
compare les références des objets, vous ne voulez pas faire cela. D'autre part, si vous utilisez data == searchValue
, vous allez comparer les représentations de chaîne des objets, à savoir [Object object]
, si vous n'avez pas redéfini les méthodes toString
.
La méthode correcte pour comparer les objets consiste donc à utiliser _.isEqual
.
Je suggère fortement de jeter un coup d'œil à lodash. Il contient pas mal de petites fonctions astucieuses qui, malheureusement, ne sont pas soulignées.
Par exemple, voici ce que vous feriez avec lodash:
var array = [{'id': 1, 'name': 'xxx'},
{'id': 2, 'name': 'yyy'},
{'id': 3, 'name': 'zzz'}];
var searchValue = {'id': 1, 'name': 'xxx'};
var index = _.findIndex(array, searchValue);
console.log(index === 0); //-> true
http://lodash.com/docs#findIndex
De plus, si vous êtes obligé d'utiliser Underscore - vous pouvez récupérer la construction de soulignement de lodash à https://raw.github.com/lodash/lodash/2.4.1/dist/lodash.underscore.js
Avec ES2015 maintenant largement utilisé (par le biais de transpilers comme Babel), vous pouvez vous passer de lodash et du soulignement pour la tâche à accomplir et utiliser des méthodes natives:
var arr = [{ id: 1 }, { id: 2}];
arr.findIndex(i => i.id === 1); // 0
Peut-être que ma suggestion vous donnera des conseils.
Pourquoi utilisez-vous callback pour la méthode indexof? La signature de indexof dans underscore.js est la suivante:
_.indexOf(array, value, [isSorted])
trouver pourrait être mieux pour cette tâche:
_.find(array, function(item, index) {
if (item.id == searchValue.id) {
alert(index);
}
});
Le soulignement utilise la méthode native indexOf si disponible, sinon applique le repli Ainsi, pour une liste d'objets, vous devez l'implémenter d'une autre manière.
Un exemple pourrait être
_.chain(array).pluck("key").indexOf("value").value();
ou
_.map(array,function(e) { return e.key; }).indexOf(value);
Avec les objets, ===
et ==
vérifient si deux références font référence à l'objet same; il ne vérifie pas les objets équivalents:
var a = {foo: "bar"};
var b = {foo: "bar"};
console.log(a === b); // false, `a` and `b` refer to different (but equivalent) objects
a = b = {something: "here"};
console.log(a === b); // true, `a` and `b` refer to the *same* object
Vous devez tester les propriétés de l'objet pour prendre la décision. Dans votre cas, la propriété id
ressemble à une bonne option. Si vous souhaitez comparer toutes les propriétés, vous pouvez utiliser le caractère isEqual
de Underscore.
_.find(array, function(item, index) {
if (item.id == searchValue.id) {
alert(index);
}
});
Si vous avez des objets complexes et que vous souhaitez rechercher un objet dans la collection à la recherche d'une propriété donnée, il vous suffit d'aller avec:
_.indexOf(arrayObj, _.findWhere(arrayObj, {id: 1}) );
Où "arrayObj" est la collection avec les objets, "id" est l'accessoire, et "1" est la valeur recherchée.