158 votes

Dans un tableau d'objets, le moyen le plus rapide de trouver l'index d'un objet dont les attributs correspondent à une recherche.

J'ai un peu navigué pour essayer de trouver un moyen efficace de le faire, mais je n'ai rien trouvé. J'ai un tableau d'objets qui ressemble à ceci :

array[i].id = some number;
array[i].name = some name;

Ce que je veux faire, c'est trouver les INDEX des objets où id est égal à, par exemple, l'un des 0, 1, 2, 3 ou 4. Je suppose que je pourrais simplement faire quelque chose comme :

var indexes = [];
for(i=0; i<array.length; i++) {
  (array[i].id === 0) ? { indexes[0] = i }
  (array[i].id === 1) ? { indexes[1] = i }
  (array[i].id === 2) ? { indexes[2] = i }
  (array[i].id === 3) ? { indexes[3] = i }
  (array[i].id === 4) ? { indexes[4] = i }
}

Bien que cela puisse fonctionner, il semble que cela soit assez coûteux et lent (sans parler de la laideur), surtout si array.length peut être grand. Avez-vous des idées pour améliorer un peu la situation ? J'ai pensé à utiliser array.indexOf d'une manière ou d'une autre mais je ne vois pas comment forcer la syntaxe. Voici

array.indexOf(this.id === 0);

par exemple, renvoie une valeur indéfinie, comme il se doit.

419voto

Peut-être souhaitez-vous utiliser des fonctions d'ordre supérieur telles que "map". Supposons que vous souhaitiez effectuer une recherche par attribut "field" :

var elementPos = array.map(function(x) {return x.id; }).indexOf(idYourAreLookingFor);
var objectFound = array[elementPos];

92voto

Umair Ahmed Points 2280

Le moyen le plus simple et le plus facile de trouver l'indice d'un élément dans un tableau.

Syntaxe ES5 : [{id:1},{id:2},{id:3},{id:4}].findIndex(function(obj){return obj.id == 3})

Syntaxe ES6 : [{id:1},{id:2},{id:3},{id:4}].findIndex(obj => obj.id == 3)

26voto

jbabey Points 20696

La nouvelle méthode Array .filter() fonctionnerait bien pour cela :

var filteredArray = array.filter(function (element) { 
    return element.id === 0;
});

jQuery peut également le faire avec .grep()

edit : il est intéressant de mentionner que ces deux fonctions ne font qu'itérer sous le capot, il n'y aura pas de différence de performance notable entre elles et le développement de votre propre fonction de filtre, mais pourquoi réinventer la roue.

19voto

PirateApp Points 1795

Si vous vous souciez des performances, n'optez pas pour trouver o filtre o carte ou l'une des méthodes susmentionnées

Voici un exemple démontrant la méthode la plus rapide. ICI Voici le lien vers le test actuel

Bloc de configuration

var items = []

for(var i = 0; i < 1000; i++) {
    items.push({id: i + 1})
}

var find = 523

Méthode la plus rapide

var index = -1
for(var i = 0; i < items.length; i++) {
    if(items[i].id === find) {
        index = i;
        break;
    }
}

Méthodes plus lentes

items.findIndex(item => item.id === find)

Méthode la plus lente

items.map(item => item.id).indexOf(find);

8voto

enapupe Points 4127

Puisqu'il n'y a pas de réponse en utilisant le tableau régulier find :

var one = {id: 1, name: 'one'};
var two = {id: 2, name:'two'}
var arr = [one, two] 

var found = arr.find((a) => a.id === 2)

found === two // true

arr.indexOf(found) // 1

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X