2015-12-02 4 views
1

Мне интересно узнать, какой метод наилучшей практики проверяет, существует ли дочерний узел.Каков наилучший способ проверить, существует ли дочерний узел в javascript?

var object = {} 

позволяет сказать, что я хотел получить доступ: object.child.element он вернется бы:

Uncaught TypeError: Cannot read property 'element' of undefined

потому что child не определено.

я мог проверить каждый узел определяются первым:

if (object.child) { 
    object.child.element 
} 

так что бы избежать TypeError, как object.child должен быть undefined, но если бы мы сказать 5 элементов, имея все это, если заявления не будут жизнеспособными решение.

Итак, что я обычно делаю, это обернуть участок в try.

try { 
    var test = object.child.element.foo.bar; 
} catch (error) { 
    console.log(error); 
} 

так test будет существовать только при наличии ребенка, элементов и узлов Foo.

Есть ли лучший образец, чем это использовать?

+0

Я предпочитаю прежний подход, и я избегаю слишком большого количества утверждений, разработанных, чтобы избежать этого. Если мне нужно 'object.child.element.foo.bar', я вызову для' object.getBar() '(который внутренне проверяет нулевой' child' и возвращает либо 'child.getBar()', либо null, и т.д.). – Brian

ответ

2

Определенно не лучшая практика с точки зрения читаемости, но я часто использую следующую структуру (не только для узлов, но в целом):

if (object.child && object.child.element) 

Посмотри здесь:

var a = {}; 
 
var b = {"child": {}}; 
 
var c = {"child": {"element": "finally"}}; 
 
      
 
console.log(a.child && a.child.element); 
 
console.log(b.child && b.child.element); 
 
console.log(c.child && c.child.element);

Код становится все хуже, чем больше гнездования существует, поэтому вы можете получить что-то некрасивое:

object && object.child && object.child.element && object.child.element.another... 

Однако, хорошая вещь в том, что он хорошо работает с заданиями, а также:

var obj = {"child": 123}; 
var other = obj && obj.child; // 123 
0

Если вы знаете имена свойств как строки, вы можете рекурсивно проверить на существование.

var properties = ["child", "element", "foo", "bar"]; 
var i = 0; 
var test = obj; 
while(i < properties.length && !!test[properties[i]]) { 
    test = test[properties[i++]]; 
} 
if(i === properties.length) console.log("success", test); 
Смежные вопросы