2010-09-12 7 views
1

Permettez-moi d'expliquer cela, j'ai une chaîne comme ceci:Utilisation. dans un [] pour entrer dans une nouvelle portée

"b.c" 

Et un objet comme celui-ci:

a = { 
    b:{ 
     c:2 
    } 
} 

Je voudrais utiliser cette chaîne pour obtenir la propriété c, mais en utilisant cela ne fonctionne pas:

a["b.c"] 

Comment puis-je utiliser la chaîne "b.c" pour fonctionner comme a.b.c? (Sans utiliser eval, perfomance est important dans mon cas)

Répondre

6

Qu'en est-il quelque chose comme ceci:

function load(path) { 
    var steps = path.split('.'); 
    var level = this; 
    for(var i=0;i<steps.length;i++) { 
     level = level[steps[i]]; 
    } 
    return level; 
}; 

var value = load(a, 'b.c'); 
+0

Merci pour la réponse rapide! J'accepterai vos questions quand le SO me le permettra. –

+5

Augmenter l'objet 'Object.prototype' n'est * pas * vraiment une bonne idée, presque tous les objets (y compris les objets hôtes tels que les éléments DOM) en héritent, par exemple si vous utilisez l'instruction' for-in' sur un objet, la propriété 'load' héritée sera énumérée, par exemple:' for (var p in {}) alert (p); Il peut également causer des problèmes avec d'autres bibliothèques, vérifiez [cet exemple] (http://jsbin.com/awalu3/2/edit) avec jQuery et votre fonction. Pourquoi pas une fonction simple comme 'function load (obj, path) {'? – CMS

+0

Solution élégante, également bon point de CMS. +1 les deux. – karim79

3

Une autre approche utilisant la méthode Array.prototype.reduce:

function load(obj, path) { 
    return path.split('.').reduce(function (a, b) { 
    return a[b]; 
    }, obj); 
} 

Utilisation:

var a = { 
    b: { 
    c: 2 
    } 
}; 


load(a, 'b.c'); // 2 

Notes:

1- La méthode reduce n'est pas disponible sur IE < = 8, mais une version conforme standard peut être trouvée dans le liked page.

2- Vous devez garder à l'esprit que les noms de propriété peuvent contenir des points, par exemple:

var a = { 
    "foo.bar": 10 
}; 

Si cette cause vous des problèmes, il serait préférable de passer un tableau à la fonction, contenant les noms de propriétés à la fonction, au lieu d'une chaîne séparée par des points.

Questions connexes