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')
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
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.
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
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);
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...
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);
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.