Duplicata possible:
Accès aux objets JavaScript imbriqués avec la clé de chaîne
Peut-être que le titre n'est pas assez clair, je ne savais pas comment spécifier ce que je cherchais et mon anglais est vraiment mauvais, désolé.
J'essaie de créer une fonction qui renvoie la valeur de l'objet, mais joue également Nice avec des objets imbriqués. Par exemple:
var obj = {
foo: { bar: 'baz' }
};
Je veux accéder à la valeur de obj.foo.bar en ajoutant la chaîne "foo.bar" à la fonction.
function(obj, path) {
// Path can be "foo.bar", or just "foo".
}
Merci!
Considère ceci:
var obj = {
foo: { bar: 'baz' }
};
function deepFind(obj, path) {
var paths = path.split('.')
, current = obj
, i;
for (i = 0; i < paths.length; ++i) {
if (current[paths[i]] == undefined) {
return undefined;
} else {
current = current[paths[i]];
}
}
return current;
}
console.log(deepFind(obj, 'foo.bar'))
Cela fonctionne correctement:
var deep_value = function(obj, path){
for (var i=0, path=path.split('.'), len=path.length; i<len; i++){
obj = obj[path[i]];
};
return obj;
};
Voici la preuve/démo: jsfiddle.net/tadeck/5Pt2q/13/
EDIT: J'ai supprimé les variables redondantes, raccourci le code.
Tu veux dire quelque chose comme ca ? C'est une version récursive
function recLookup(obj, path) {
parts = path.split(".");
if (parts.length==1){
return obj[parts[0]];
}
return recLookup(obj[parts[0]], parts.slice(1).join("."));
}
quelque chose comme:
function(obj, path) {
var current=obj;
path.split('.').forEach(function(p){ current = current[p]; });
return current;
}
Vous souhaitez diviser la chaîne sur le point, puis indexer à plusieurs reprises dans l'objet, par exemple le long des lignes de:
function goDeep(obj, path) {
var parts = path.split('.'),
rv,
index;
for (rv = obj, index = 0; rv && index < parts.length; ++index) {
rv = rv[parts[index]];
}
return rv;
}
Cela fonctionne parce que vous pouvez accéder à la propriété d'un objet de différentes manières: la syntaxe en pointillés utilise un littéral (obj.foo
) et la syntaxe entre crochets utilise une chaîne (obj["foo"]
). Dans ce dernier cas, la chaîne peut être le résultat de n'importe quelle expression, elle ne doit pas être un littéral de chaîne. Dans tous les, rv
a la même valeur:
rv = obj.foo.bar;
// Or
rv = obj.foo["bar"];
// Or
f = "foo";
rv = obj[f].bar;
// Or
s = "b";
rv = obj.foo[s + "ar"];