web-dev-qa-db-fra.com

Obtenir l'index d'un élément d'un tableau en fonction de ses propriétés

J'ai un tableau d'objets JavaScript comme celui-ci:

var myArray = [{...}, {...}, {...}];

Chaque objet a une id unique parmi d'autres propriétés:

{ 
  id: 4,
  property1: 'something',
  property2: 'something'
}

Comment puis-je obtenir un index d'un objet particulier dans ce tableau, si je connais seulement sa propriété id? Donc, si je connais ce myArray[x].id == 4, comment puis-je trouver x?

25
Robert Kirsz
var index = myArray.map(function(el) {
  return el.id;
}).indexOf(4);

Pour IE sous la version 9, map nécessite un patch, ou utilisez simplement une boucle.

59
xdazz

Ou avec la syntaxe ES6:

let index = myArray.map( el => el.id ).indexOf(4)

ou

let index = myArray.findIndex( el => el.id === 4 )
15
Dmitry Shvedov

Pourquoi ne pas simplement faire une boucle?

function indexOfId(array, id) {
    for (var i=0; i<array.length; i++) {
       if (array[i].id==id) return i;
    }
    return -1;
}

Le fait qu'il y ait de nombreuses installations dans js (ou bibliothèques js) ne signifie pas que vous ne devez pas, parfois, écrire une boucle. C'est simple et rapide.

7
Denys Séguret

ES6 Array.findIndex

const myArray = [{id:1}, {id:2}, {id3}];
const foundIndex = myArray.findIndex((el) => (el.id === 3));
1
yar1

Vous pouvez utiliser .reduce(), qui vous permet de réduire un tableau à une seule valeur.

var obj_idx = myArray.reduce(function(idx, item, i) {
  return item.id === 4 ? i : idx;
}, -1);

Le -1 est une valeur par défaut si aucune correspondance n'est trouvée.


Si vous avez plusieurs utilisations, vous pouvez créer une fabrique de fonctions.

function idxForID(target) {
    return function(idx, item, i) {
      return item.id === target ? i : idx;
    };
}

Et puis utilisez-le comme ça.

var obj_idx = myArray.reduce(idxForID(4), -1);
0
I Hate Lazy

Si chaque identifiant est unique, vous pouvez le faire comme ceci:

o1 = {id:1}
o2 = {id:2}
o3 = {id:3}
o4 = {id:4}
a = [o1,o2,o3,o4]
a.indexOf( a.filter( function(i){return i.id==4} )[0] );
0
Marcus

Vous pouvez également essayer une fonction récursive, bien que @ xdazz soit plutôt attrayant.

var indexOfId = function(arr, id, index) {
    if (!index) { index = 0; }
    if (arr[index].id == id) {
      return index;
    }
    return ((index += 1) >= arr.length) ? -1 : indexOfId(arr, id, index);
};
0
jeremy