2015-12-02 120 views
1

我很想知道檢查子節點是否存在的最佳實踐方法。檢查javascript中是否存在子節點的最佳方法是什麼?

var object = {} 

可以說,我想訪問:object.child.element它將返回:

Uncaught TypeError: Cannot read property 'element' of undefined

因爲child是不確定的。

我可以檢查每個節點首先被定義:

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

所以這將避免TypeErrorobject.child應該undefined,但如果我們不得不說的5個元素,讓所有這些if語句將不會是一個可行的解。

所以我傾向於做的是把這個地段包裝在try

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

so test只有存在child,element和foo節點時纔會存在。

有沒有比這更好的模式使用?

+0

我更喜歡前一種方法,並避免設計太多if語句來避免它。如果我需要'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); 
相關問題