2013-02-12 78 views
1

考慮我有這樣的對象:現在如果我想確保zoo有一個值,而不是空在`if`條件下檢查嵌套對象的更好方法是什麼?

Obj.Boo.Foo.Zoo 

好吧,我應該做的:

if(Obj != null && Obj.Boo != null && Obj.Boo.Foo != null && Obj.Boo.Foo.Zoo != null) { 
    //blah blah 
} 

,如果我有更多的嵌套的對象Zoo後,我應該擴大if和代碼變得有點畸形。

有沒有更好的方法來做這種類型的條件?

+0

這是Java還是javascript? – 2013-02-12 05:49:40

+0

@MikhailVladimirov JavaScript,也標記爲JavaScript的問題。 – 2013-02-12 05:51:03

回答

3

我保持一點功能我打電話chainGet(obj, chain, default)各地的情況就像這樣:

function chainGet(obj, chain, dflt) { 
    if (typeof chain === "string") 
     chain = chain.split("."); 
    var result = obj; 
    for (var i = 0; i < chain.length; i += 1) { 
     if (result === undefined) 
      break; 
     result = result[chain[i]]; 
    } 
    return result === undefined? dflt : result; 
} 

例如:

> chainGet({ foo: 42 }, "foo") 
42 
> chainGet({ foo: 42 }, "bar", "x") 
'x' 
> chainGet({ foo: { bar: 42 }}), "foo.bar") 
42 

這甚至與陣列的工作原理:

> chainGet([{ foo: [42] }], [0, "foo", 0]) 
42 

中當然,虛線訪問的長鏈是a code smell,所以謹慎應該是在使用它們時行使......但有時你拿到這樣做;)

+0

多麼酷的黑客! +1 – 2013-02-12 06:22:09

+0

這是否適合你,@AfshinMehrabani?你不能使用'default',並且結果變成'obj [chain [i]]',這意味着它永遠不會深入到對象中。我試圖改變代碼,大衛,但它看起來像你拒絕它。 – MiniGod 2013-02-12 06:47:24

+0

錯誤,是的,這是我的代碼中的錯誤:)我沒有拒絕編輯...我從來沒有見過它。我想那是評論家。 – 2013-02-12 07:00:44

0

,如果你並不真正需要處理這樣的情況下,將嘗試訪問在一個try catch語句

try{ 
    // access Obj.Boo.Foo.Zoo 
} 
catch{ 
    // catch a NullReferenceException 
} 
對象一個壞的習慣

更好的方法是修改你的getter和setter,以便父對象拋出一個合適的異常,或者當你嘗試訪問一個子對象和它的null時處理這個異常。在這種情況下,檢查第一個對象就足夠了。

+0

是的,我認爲如此,但正如你所說,這不是一個好方法。 – 2013-02-12 06:27:57

+0

有些情況下(例如,性能很重要),如果你這樣做不是太糟糕:'try {var x = foo.bar.baz; catch(e){...}; x();' - 確保在try塊外使用該值,因此唯一可以捕獲的異常是鏈查找中的npx。 – 2013-02-12 06:29:58

+0

@AfshinMehrabani沒有人知道你的代碼,因此你必須決定具體的情況,在一個新的代碼中,我會以正確的方式做,你應該設計一個確保這些ibjects被分配的程序它的理想或你說我不適當的情況下,這些可能是空值,所以你在getter方法中檢查它們。 – CloudyMarble 2013-02-12 06:34:41

相關問題