web-dev-qa-db-fra.com

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')
48
Omu

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 propriété 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 voulez:

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
45
nnnnnn

Je sais que cette question est ancienne, mais personne n’a encore évoqué de solution native. Si vous n'essayez pas de supporter les navigateurs archaïques (ce que vous ne devriez pas être en ce moment), vous pouvez utiliser array.filter:

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

var found = arr.filter(function(item) { return item.name === 'k1'; });

console.log('found', found[0]);
Check the console.

Vous pouvez voir un liste des navigateurs supportés ici.

Dans le futur avec ES6, vous pourrez utiliser array.find.

60
Langdon

Pour répondre à votre question exacte, vous pouvez obtenir le comportement exact souhaité 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;
    }
};

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

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

Trouver un élément

Pour trouver l'élément avec un nom donné dans un tableau, vous pouvez utiliser find :

arr.find(item=>item.name=="k1");

Notez que find renverra un seul élément (à savoir la première correspondance):

{
  "name": "k1",
  "value": "abc"
}

Trouver tous les éléments

Dans votre tableau d'origine, il n'y a qu'une seule occurrence d'élément de chaque nom.

Si le tableau contient plusieurs éléments portant le même nom et que vous les voulez tous, utilisez filter , qui renverra un tableau.

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

var item;

// find the first occurrence of item with name "k1"
item = arr.find(item=>item.name=="k1");
console.log(item);

// find all occurrences of item with name "k1"
// now item is an array
item = arr.filter(item=>item.name=="k1");
console.log(item);

Trouver des indices

De même, pour les index, vous pouvez utiliser findIndex (pour trouver la première correspondance) et filter + map pour trouver tous les index.

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

var idx;

// find index of the first occurrence of item with name "k1"
idx = arr.findIndex(item=>item.name == "k1");
console.log(idx, arr[idx].value);

// find indices of all occurrences of item with name "k1"
// now idx is an array
idx = arr.map((item, i) => item.name == "k1" ? i : '').filter(String);
console.log(idx);
17
user2314737

Vous ne pouvez pas faire ce que vous demandez de manière native avec un tableau, mais les objets javascript sont des hachages, vous pouvez donc dire ...

var hash = {};
hash['k1'] = 'abc';
...

Ensuite, vous pouvez récupérer en utilisant la notation crochet ou point:

alert(hash['k1']); // alerts 'abc'
alert(hash.k1); // also alerts 'abc'

Pour les tableaux, vérifiez le bibliothèque underscore.js en général et le méthode de détection en particulier. En utilisant détecter, vous pouvez faire quelque chose comme ...

_.detect(arr, function(x) { return x.name == 'k1' });

Ou plus généralement

MyCollection = function() {
  this.arr = [];
}

MyCollection.prototype.getByName = function(name) {
  return _.detect(this.arr, function(x) { return x.name == name });
}

MyCollection.prototype.Push = function(item) {
  this.arr.Push(item);
}

etc...
3
Rob

Je ne connais rien à jquery, je ne peux donc pas vous aider, mais en ce qui concerne Javascript, vous avez un tableau d'objets. Vous ne pourrez donc accéder aux noms et aux valeurs que par le biais de chaque élément du tableau. Par exemple arr[0].name te donnera 'k1', arr[1].value te donnera 'hi'.

Peut-être que vous voulez faire quelque chose comme:

var obj = {};

obj.k1 = "abc";
obj.k2 = "hi";
obj.k3 = "oa";

alert ("obj.k2:" + obj.k2);
2
blankabout

L’approche la plus simple que j’ai utilisée est

var found = arr.find(function(element) {
         return element.name === "k1";
 });

//If you print the found :
console.log(found);
=> Object { name: "k1", value: "abc" }

//If you need the value
console.log(found.value)
=> "abc"

Une approche similaire peut être utilisée pour rechercher les valeurs du tableau JSON en fonction des données d’entrée du fichier JSON.

0
Ashish Girdhar