65 votes

obtenir un élément d'un tableau de nom, valeur JSON

J'ai ce tableau :

 var arr = [];
arr.push({name:"k1", value:"abc"});
arr.push({name:"k2", value:"hi"});
arr.push({name:"k3", value:"oa"});

est-il possible d'obtenir la valeur ou un élément spécifique en connaissant le nom ?

quelque chose comme ça:

 arr['k2'].value

ou

 arr.get('k1')

51voto

nnnnnn Points 70578

Les tableaux sont normalement accessibles via des index numériques, donc dans votre exemple arr[0] == {name:"k1", value:"abc"} . Si vous savez que la name de chaque objet sera unique, vous pouvez les stocker dans un objet au lieu d'un tableau, comme suit :

 var obj = {};
obj["k1"] = "abc";
obj["k2"] = "hi";
obj["k3"] = "oa";

alert(obj["k2"]); // displays "hi"

Si vous voulez réellement un tableau d'objets comme dans votre article, vous pouvez parcourir le tableau et revenir lorsque vous trouvez un élément avec un objet ayant la propriété que vous souhaitez :

 function findElement(arr, propName, propValue) {
  for (var i=0; i < arr.length; i++)
    if (arr[i][propName] == propValue)
      return arr[i];

  // will return undefined if not found; you could return a default instead
}

// Using the array from the question
var x = findElement(arr, "name", "k2"); // x is {"name":"k2", "value":"hi"}
alert(x["value"]); // displays "hi"

var y = findElement(arr, "name", "k9"); // y is undefined
alert(y["value"]); // error because y is undefined

alert(findElement(arr, "name", "k2")["value"]); // displays "hi";

alert(findElement(arr, "name", "zzz")["value"]); // gives an error because the function returned undefined which won't have a "value" property

19voto

mythz Points 54874

Pour répondre exactement à votre question, vous pouvez obtenir le comportement exact que vous souhaitez en étendant le prototype Array avec :

 Array.prototype.get = function(name) {
    for (var i=0, len=this.length; i<len; i++) {
        if (typeof this[i] != "object") continue;
        if (this[i].name === name) return this[i].value;
    }
};

cela ajoutera la méthode get() à tous les tableaux et vous permettra de faire ce que vous voulez, c'est-à-dire :

 arr.get('k1'); //= abc

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