2010-10-17 62 views
16

我從ajax請求有以下JSON響應。檢查是否定義了一個對象,最佳做法。

var json = { 
    "response": { 
     "freeOfChargeProduct": { 
     "description": "Product", 
     "orderQty": 5, 
     "productName": "XYZ", 
     "qty": 6, 
     "details": { 
      "price": 55.5, 
      "instock": "true", 
      "focQuantity": 1 
     } 
    }, 
    "orderLineId": 4788, 
    "totalOrderLinePrice": "741.36", 
    "totalOrderPrice": "1,314.92", 
    "totalQty": 17 
}; 

的JSON這麼想的始終返回 「freeOfChargeProduct」 屬性。所以,如果我想要得到的「freeOfChargeProduct」的價格,那麼我必須做到以下幾點:

var getFreeOfChargeProductPrice = function() { 
    var r = json.response; 
    if (r && r.freeOfChargeProduct && r.freeOfChargeProduct.details) { 
     return r.freeOfChargeProduct.details.price;   
    } 
    return null; 
}; 

沒有問題。但是檢查對象中的每個屬性都非常煩人,所以我創建了一個函數來檢查對象中的屬性是否被定義。

var getValue = function (str, context) { 
    var scope = context || window, 
     properties = str.split('.'), i; 
    for(i = 0; i < properties.length; i++) { 
     if (!scope[properties[i]]) {      
     return null; 
     } 
     scope = scope[properties[i]];   
    } 
    return scope; 
}; 

var price = getValue('json.response.freeOfChargeProduct.details.price'); 
// Price is null if no such object exists. 

現在我的問題:這是一個好或壞的方法來檢查,如果在一個對象存在的屬性?任何更好的建議/方法?

編輯:

我不wan't使用& & - 運算符。我很懶,我正在尋找一個可重用的方法來檢查是否定義了一個對象(或對象的屬性)。

:)謝謝!

+1

我有一個[類似的問題](http://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key)回來。您可能對某些回覆感興趣。 – user113716 2010-10-17 18:32:46

+0

謝謝你的回答!我找到了一個答案(由肯尼貝克發佈),並給了它+1 :) – nekman 2010-10-17 18:42:27

回答

13
if(x && typeof x.y != 'undefined') { 
    ... 
} 

// or better 
function isDefined(x) { 
    var undefined; 
    return x !== undefined; 
} 

if(x && isDefined(x.y)) { 
    ... 
} 

這將適用於JavaScript中的任何數據類型,甚至是零的數字。如果您正在檢查對象或字符串,只需在if語句中使用x && x.y,或者如果您已經知道x是對象,則if(x.y) ...

19

使用保護模式:

if (json.response && json.response.freeOfChargeProduct && json.response.freeOfChargeProduct.details) { 
    // you can safely access the price 
} 

這是保護模式是如何工作的。

if (a && a.b && a.b.c) { ... } else { ... } 

第一個檢查是「物業a是否存在?」。否則,else分支被執行。如果是,則進行下一個檢查,即「對象a是否包含屬性b?」。如果否,則執行else分支。如果是,則最終檢查發生:「對象a.b是否包含屬性c?」。如果否,則執行else分支。如果是(並且只有那樣),則執行if分支。

更新:爲什麼叫做「守衛模式」?

var value = a && b; 

在本例中,構件b(右操作數)由操作者&&把守。只有成員a(左操作數)是真的(「值得」),纔會返回成員b。但是,如果成員a是虛假的(「不值得」),那麼它本身被返回。

順便說一句,大家都falsy如果他們返回這些值:nullundefined0""falseNaN。在所有其他情況下,會員都很好。

+9

你叫它後衛?我稱之爲合乎邏輯的......以前從未聽說過*警衛操作員*,但也許有人可以指給我一個資料來源? – 2010-10-17 18:42:31

+0

是的,我可以使用&& - 操作符。但是我想使用一個通用的解決方案,我可以重新使用任何對象。 – nekman 2010-10-17 18:45:06

+0

守衛是他的綽號。 (因爲它保護第二個操作數:如果第一個操作數是虛假的,它將返回第一個操作數,如果第一個操作數是truthy,則返回第二個操作數。) – 2010-10-17 18:45:27

0

你可以做這樣的事情:

try{ 
    var focp = json.response.freeOfChargeProduct 
    var text = "You get " + focp.qty + " of " + 
     focp.productName + 
     " for only $" + (focp.qty-focp.details.focQuantity)*focp.details.price + 
     ", You save $" + focp.details.focQuantity*focp.details.price; 
    $("order_info").innerText = text; 
} catch(e) { 
    // woops, handle error... 
} 

它會在你的問題產生,從所提供的數據這樣的消息,如果字段存在:

你得到XYZ的6只$ 277,5,您節省$ 55.5

如果數據不存在,您將最終進入catch塊。如果你不能想出處理錯誤的方法(也許會對數據做一個新的AJAX請求?),你總是可以試試,抓住,忘記這裏。

1

這不是一個語法問題,因爲它是設計模式問題。

問題答。 *您是否擁有對json服務器的控制權?

如果答案是否定的,我認爲,情況將全部在客戶端。

請仔細閱讀本: http://martinfowler.com/eaaDev/PresentationModel.html

由於服務器是源,在這種情況下,它會提供模型。 此模式指定了其他工件:演示模型(PM)。在JavaScript中,我會建議兩個工件,一個額外的轉換器代碼。

根據此設計模式,PM負責將模型轉換爲PM,並在必要時再返回。在你的情況下,永遠不會發生從PM到M的轉換。

這意味着一個js對象有一個方法或構造函數來消化模型並在轉換器(下面)的幫助下轉換自己。

這樣做,你會最終有一個PM看起來像這樣:

var OrderlinePM = { 
    "hasFreeOfCharge": false | true, 
    "freeOfCharge" : {...} 

enter code here this.getFreeOfCharge =函數(){ ... } this.fromModel =功能(jsonEntry,轉換器) {// 轉換此與轉換器)到對於這個特定視圖可用OrderlinePM //也inwith ... } 「orderLineId」:0, 「totalOrderLinePrice」: 「741.36」, 「噸otalOrderPrice「:」1,314.92「, 」totalQty「:17 };

function mySpecialFunctionPMConvertor { this.fromModel = functiono(){//對模型做一些奇怪的事情,並用它挖掘一個PM。 }}

好吧,我放棄了試圖格式代碼在這個富文本編輯器:(

  • 你可以有幾個PM:獻給所有因同一模型對象不同勢任務
  • 此外,這將使轉換器對象可測試的東西,可以自動執行.... ERR OK莫比手動,但無論如何。

那麼繁瑣的反射代碼的問題真的不是proble米但凝聚力在JavaScript中是一個問題。

相關問題