web-dev-qa-db-fra.com

Javascript: Obtenez une valeur profonde de l'objet en lui passant le chemin sous forme de chaîne

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!

56
7elephant

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'))
40
qiao

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.

74
Tadeck

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("."));
}

Voir http://jsfiddle.net/kExSr/

8
fyr

quelque chose comme:

function(obj, path) {
  var current=obj; 
  path.split('.').forEach(function(p){ current = current[p]; }); 
  return current;
}
6
Dan D.

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;
}

exemple en direct

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"];
4
T.J. Crowder