web-dev-qa-db-fra.com

Comment trouver l'index d'un objet dans un tableau à l'aide de underscore.js?

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? 

10
prince

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.

14
Minko Gechev

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


ES2015

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
15
Kasper Lewau

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);
  }
});
3

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);
2
n_n

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.

2
T.J. Crowder
_.find(array, function(item, index) {
  if (item.id == searchValue.id) {
    alert(index);
  }
});
0
riyas tk

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.

0
Nicolae Lozovan