function resolve(cur, ns) {
var undef;
ns = ns.split('.');
while (cur && ns[0])
cur = cur[ns.shift()] || undef;
return cur;
}
например.
// 1:
resolve({
foo: { bar: 123 }
}, 'foo.bar'); // => 123
// 2:
var complex = {
a: {
b: [
document.createElement('div')
]
}
};
resolve(complex, 'a.b.0.nodeName'); // => DIV
Преимущество использования этого в том, что оно не выдаст ошибку, если вы попытаетесь получить доступ к чему-то, что не существует - оно изящно вернет undefined
.
EDIT:
В комментарии Энди упомянул, что это не приводит к ошибкам там, где это можно ожидать. Я согласен, что получение undefined
является немного общим, и нет никакого способа определить, было ли ваше значение действительно разрешено. Итак, чтобы исправить это, попробуйте это:
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;
}
}());
Он возвратит РАЗРЕШЕННЫЙ объект, который можно проверить следующим образом:
var result = resolve(someObject, 'a.b.c');
if (result === resolve.UNRESOLVED) {...}
Это не идеально, но это (IMO) лучший способ определить неразрешенное пространство имен без необходимости выдавать ошибки. Если вы хотите ошибок, просто продолжайте:
someObject.a.b.c; //...