function resolve(cur, ns) {
var undef;
ns = ns.split('.');
while (cur && ns[0])
cur = cur[ns.shift()] || undef;
return cur;
}
P. ej
// 1:
resolve({
foo: { bar: 123 }
}, 'foo.bar'); // => 123
// 2:
var complex = {
a: {
b: [
document.createElement('div')
]
}
};
resolve(complex, 'a.b.0.nodeName'); // => DIV
El beneficio en el uso de esto es que no generará un error si se intenta acceder a algo que no existe - que va a regresar con gracia undefined
.
EDIT:
En el comentario, Andy mencionó que esto no generan errores que uno podría esperar que lo haga. Estoy de acuerdo en que obtener undefined
es un poco genérico y no hay forma de saber si su valor fue realmente resuelto. Así que, para remediar eso, intente esto:
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;
}
}());
que va a devolver un objeto sin resolver que se puede comprobar de esta manera:
var result = resolve(someObject, 'a.b.c');
if (result === resolve.UNRESOLVED) {...}
No es perfecto, pero es (OMI) la mejor manera para determinar un espacio de nombres sin resolver sin tener que lanzar errores. Si desea que los errores, a continuación, sólo seguir adelante con:
someObject.a.b.c; //...
¿Se refiere a JSON, o un objeto JavaScript? Ellos no son lo mismo. –