function resolve(cur, ns) {
var undef;
ns = ns.split('.');
while (cur && ns[0])
cur = cur[ns.shift()] || undef;
return cur;
}
Par exemple
// 1:
resolve({
foo: { bar: 123 }
}, 'foo.bar'); // => 123
// 2:
var complex = {
a: {
b: [
document.createElement('div')
]
}
};
resolve(complex, 'a.b.0.nodeName'); // => DIV
L'avantage de cette méthode est qu'elle ne déclenchera pas d'erreur si vous essayez d'accéder à quelque chose qui n'existe pas -- elle retournera gracieusement undefined
.
EDIT :
Dans le commentaire, Andy a mentionné que cela n'entraîne pas d'erreurs là où on pourrait s'y attendre. Je suis d'accord sur le fait qu'obtenir undefined
est un peu générique et il n'y a aucun moyen de savoir si votre valeur a vraiment été résolue. Donc, pour remédier à cela, essayez ceci :
var resolve = (function(){
var UNRESOLVED = resolve.UNRESOLVED = {};
return resolve;
function resolve(cur, ns) {
var undef;
ns = ns.split('.');
while (cur && ns[0])
cur = cur[ns.shift()] || undef;
if (cur === undef || ns[0]) {
return UNRESOLVED;
}
return cur;
}
}());
Il retournera un objet UNRESOLVED qui peut être vérifié comme suit :
var result = resolve(someObject, 'a.b.c');
if (result === resolve.UNRESOLVED) {...}
Ce n'est pas parfait, mais c'est (IMO) la meilleure façon de déterminer un espace de nom non résolu sans avoir à lancer des erreurs. Si vous voulez des erreurs, alors allez-y :
someObject.a.b.c; //...