2013-05-11 3 views
3
var foo = function(o) {... 

Параметр o может быть нулевым или содержать или не содержать определенные вложенные объекты.Доступ к возможно вложенным свойствам в javascript?

Я хочу найти значение o.foo.bar.baz.chomp.mumble. Если какой-либо из mumble или его содержащих объектов имеет значение null, я хочу получить null.

Я могу это сделать (в данном случае, я могу предположить, что все элементы пути являются либо объектами, либо не существует - ни один из них не пустой, не являющиеся объектами):

var mumble = o && o.foo && o.foo.bar && o.foo.bar.baz 
    && o.foo.bar.baz.chomp ? o.foo.bar.baz.chomp.mumble : null; 

Или я могу сделать это:

var mumble = null; 
try { 
    mumble = o.foo.bar.baz.chomp.mumble; 
} 
catch { //ignore null pointer exception} 

или я могу это сделать:

var nestedVal = function(o, a) { 

    if(isString(a)) { 
     a = a.split('.'); 
    } 
    var i = 0, j = a.length; 
    for(; o && isObject(o) && i < j; ++i) { 
     o = o[ a[ i ] ]; 
    } 
    return i == j ? o : null; 
}; 


var mumble = nestedValue(o, "foo.bar.baz.chomp.mumble"); 

Что предпочтительнее, или есть четвертый, лучше, способ сделать Тхи s?

+1

http://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key?rq=1 –

ответ

1

Всё зависит! Первые два решения фиксируют имена свойств, и это кажется более ограничительным. Я бы предпочел, чтобы ваше последнее решение было самым гибким. Однако моя реализация будет следующей:

var nestedVal = function (o, a) { 
    return a.split ('.').reduce (
     function (o, p) { 
     return o && p in o ? o[p] : null; 
     }, o); 
}; 

В вашем решении поведение, если a не является строкой, кажется произвольным. Вы разрешаете быть массивом имен свойств? Мое решение требует, чтобы параметр a был строкой.

Смежные вопросы