95 votes

Comment trouver l'index d'un objet par la clé et la valeur dans un tableau en javascript ?

Étant donné :

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

Recherché :

Index de l'objet où attr === value par exemple attr1 === "john" ou attr2 === "hummus"

Mise à jour : Lisez attentivement ma question, je ne veux pas trouver l'objet via $.inArray ni obtenir la valeur d'un attribut spécifique de l'objet. Veuillez en tenir compte dans vos réponses. Merci !

187voto

j3frea Points 5021

L'approche fonctionnelle

Tous les jeunes branchés font de la programmation fonctionnelle ( Bonjour les utilisateurs de React ) ces jours-ci, j'ai donc pensé donner une solution fonctionnelle. À mon avis, c'est en fait beaucoup plus agréable que l'imperatif for y each qui ont été proposées jusqu'à présent et avec la syntaxe ES6, c'est assez élégant.

Mise à jour

Il existe désormais un excellent moyen de le faire, appelé findIndex qui prend une fonction qui retourne true / false en fonction de la correspondance de l'élément du tableau (comme toujours, vérifiez la compatibilité du navigateur).

var index = peoples.findIndex(function(person) {
  return person.attr1 == "john"
});

Avec la syntaxe ES6, vous pouvez écrire ceci :

var index = peoples.findIndex(p => p.attr1 == "john");

La (vieille) approche fonctionnelle

TL;DR

Si vous êtes à la recherche de index donde peoples[index].attr1 == "john" utiliser :

var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");

Explication

Étape 1

Utilice .map() pour obtenir un tableau de valeurs en fonction d'une clé particulière :

var values = object_array.map(function(o) { return o.your_key; });

La ligne ci-dessus vous emmène à partir d'ici :

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

Jusqu'ici :

var values = [ "bob", "john", "larry" ];

Étape 2

Maintenant, nous utilisons simplement .indexOf() pour trouver l'index de la clé que nous voulons (qui est, bien sûr, également l'index de l'objet que nous recherchons) :

var index = values.indexOf(your_value);

Solution

Nous combinons tous ces éléments :

var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");

Ou, si vous préférez la syntaxe ES6 :

var index = peoples.map((o) => o.attr1).indexOf("john");

Démonstration :

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

var index = peoples.map(function(o) { return o.attr1; }).indexOf("john");
console.log("index of 'john': " + index);

var index = peoples.map((o) => o.attr1).indexOf("larry");
console.log("index of 'larry': " + index);

var index = peoples.map(function(o) { return o.attr1; }).indexOf("fred");
console.log("index of 'fred': " + index);

var index = peoples.map((o) => o.attr2).indexOf("pizza");
console.log("index of 'pizza' in 'attr2': " + index);

21voto

return1.at Points 980

Si vous voulez vérifier l'objet lui-même sans interférer avec le prototype, utilisez hasOwnProperty() :

var getIndexIfObjWithOwnAttr = function(array, attr, value) {
    for(var i = 0; i < array.length; i++) {
        if(array[i].hasOwnProperty(attr) && array[i][attr] === value) {
            return i;
        }
    }
    return -1;
}

pour inclure également les attributs du prototype, utiliser :

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

9voto

thecodeparadox Points 41614

Utilisation de jQuery .each()

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

$.each(peoples, function(index, obj) {
   $.each(obj, function(attr, value) {
      console.log( attr + ' == ' + value );
   });
});

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

Utilisation de for-loop :

var peoples = [
  { "attr1": "bob", "attr2": "pizza" },
  { "attr1": "john", "attr2": "sushi" },
  { "attr1": "larry", "attr2": "hummus" }
];

for (var i = 0; i < peoples.length; i++) {
  for (var key in peoples[i]) {
    console.log(key + ' == ' + peoples[i][key]);
  }
}

5voto

Ce n'est pas une réponse directe à votre question, mais je pense que cela vaut la peine de le mentionner, car votre question semble s'inscrire dans le cas général de "l'obtention de choses par nom dans un stockage clé-valeur".

Si vous n'êtes pas très attaché à la façon dont "peoples" est implémenté, une façon plus JavaScript d'obtenir le bon gars pourrait être :

var peoples = {
  "bob":  { "dinner": "pizza" },
  "john": { "dinner": "sushi" },
  "larry" { "dinner": "hummus" }
};

// If people is implemented this way, then
// you can get values from their name, like :
var theGuy = peoples["john"];

// You can event get directly to the values
var thatGuysPrefferedDinner = peoples["john"].dinner;

J'espère que si ce n'est pas la réponse que vous souhaitiez, cela pourra aider les personnes intéressées par la question "clé/valeur".

4voto

davids Points 3390
function getIndexByAttribute(list, attr, val){
    var result = null;
    $.each(list, function(index, item){
        if(item[attr].toString() == val.toString()){
           result = index;
           return false;     // breaks the $.each() loop
        }
    });
    return result;
}

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