294 votes

Comment obtenir l'index d'un objet par sa propriété en JavaScript ?

Par exemple, j'ai :

var Data = [
  { id_list: 1, name: 'Nick', token: '312312' },
  { id_list: 2, name: 'John', token: '123123' },
]

Alors, je veux trier/renverser cet objet par name par exemple. Et puis je veux obtenir quelque chose comme ça :

var Data = [
  { id_list: 2, name: 'John', token: '123123' },
  { id_list: 1, name: 'Nick', token: '312312' },
]

Et maintenant je veux connaître l'index de l'objet avec la propriété name='John' pour obtenir la valeur du jeton de propriété.

Comment puis-je résoudre le problème ?

0 votes

Pourquoi voulez-vous d'abord trier la liste avant de rechercher le bien ?

0 votes

Les objets JavaScript sont {Key:Value} je l'ai réparé pour toi.

0 votes

4voto

Andrew D. Points 3555

Le seul moyen que je connaisse est de parcourir en boucle tous les tableaux :

var index = -1;
for(var i=0; i<Data.length; i++)
  if(Data[i].name === "John") {
    index = i;
    break;
  }

Ou insensible à la casse :

var index = -1;
for(var i=0; i<Data.length; i++)
  if(Data[i].name.toLowerCase() === "john") {
    index = i;
    break;
  }

Sur la variable de résultat indice contient l'index de l'objet ou -1 si non trouvé.

2voto

Patrik Wallin Points 46

Une façon prototypique

(function(){
  if (!Array.prototype.indexOfPropertyValue){
       Array.prototype.indexOfPropertyValue = function(prop, value){
      for (var index = 0; index < this.length; index++){
        if (this[index][prop]){
          if (this[index][prop] == value){
            return index;
          }
        }
       }
      return -1;
    }
  }
 })();

 // Usage:
 var Data = [
   {id_list:1, name:'Nick', token:'312312'}, {id_list:2, name:'John', token:'123123'}];

 Data.indexOfPropertyValue('name', 'John'); // Returns 1 (index of array);
 Data.indexOfPropertyValue('name', 'Invalid name') // Returns -1 (no result);
 var indexOfArray = Data.indexOfPropertyValue('name', 'John');
 Data[indexOfArray] // Returns the desired object.

0 votes

J'ai dû le modifier un peu pour l'adapter à ma situation : je cherchais l'index d'une propriété dont la valeur était nulle et la cinquième ligne faisait sauter cet index.

1voto

StevenGilligan Points 1333

Vous pouvez utiliser Array.sort en utilisant une fonction personnalisée comme paramètre pour définir votre mécanisme de tri.

Dans votre exemple, cela donnerait :

var Data = [
    {id_list:1, name:'Nick',token:'312312'},{id_list:2,name:'John',token:'123123'}
]

Data.sort(function(a, b){
    return a.name < b.name ? -1 : a.name > b.name ? 1 : 0;
});

alert("First name is : " + Data[0].name); // alerts 'John'
alert("Second name is : " + Data[1].name); // alerts 'Nick'

La fonction de tri doit retourner soit -1 si a doit venir avant b, 1 si a doit venir après b et 0 si les deux sont égaux. C'est à vous de définir la bonne logique dans votre fonction de tri pour trier le tableau.

J'ai manqué la dernière partie de votre question où vous voulez connaître l'indice. Comme d'autres l'ont dit, vous devez parcourir le tableau en boucle pour le trouver.

1voto

Sascha Galley Points 7516

Il suffit de parcourir votre tableau et de trouver la position :

var i = 0;
for(var item in Data) {
    if(Data[item].name == 'John')
        break;
    i++;
}
alert(i);

0 votes

Cela devrait être if(Data[item].name == 'John') je l'ai réparé pour toi.

0 votes

Il y a un moment. Si la variable 'not found' (introuvable) i contiennent un indice positif. Et pour tester 'non trouvé', il faut comparer si i===Data.length

0 votes

Le deuxième moment est si le tableau contient des propriétés personnalisées non indexées. Par exemple : var Data[1,2,3,4,5] ; Data["test"]=7897 ; Comparez la sortie de : for(var i in Data)alert(Data[i]) ; y for(var i=0;i<Data.length;i++)alert(Data[i]) ;

1voto

Ashish Points 648

Cela pourrait être utile :

function showProps(obj, objName) {
  var result = "";
  for (var i in obj)
    result += objName + "." + i + " = " + obj[i] + "\n";
  return result;
}

J'ai copié ceci à partir de _Travailler avec des objets_ .

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