2011-04-27 250 views
0

由於我正在進行的AJAX調用,我無法訪問作爲JSON從服務器端腳本接收的對象中的某些屬性。根據對象本身的數據,我的JSON數據可以有兩種形式。JavaScript對象迭代

表1:

 "MY_OBJ" : { "FILE" : "myfile.txt", 
     "PARAMS" : { "PARAM" : { "KEY" : "mykey", 
       "VALUE" : "myvalue" 
       } } 
      } 

表2:

 "MY_OBJ" : { "FILE" : "myfile.txt", 
     "PARAMS" : { "PARAM" : [ { "KEY" : "mykeyone", 
        "VALUE" : "myvalueone" 
       }, 
       { "KEY" : "mykeytwo", 
        "VALUE" : "myvaluetwo" 
       } 
       ] } 
      } 

這是我當前如何試圖解析的數據在瀏覽器中顯示:

function(v) { 
var myFormattedData = v.FILE; 
if (v.PARAMS !== undefined && v.PARAMS.PARAM !== undefined && v.PARAMS.PARAM.KEY !== undefined && v.PARAMS.PARAM.VALUE !== undefined) { 
    myFormattedData += '<br />' + v.PARAMS.PARAM.KEY + ' : ' + v.PARAMS.PARAM.VALUE; 
} } 

這種方法當我的數據在表單1中工作正常。在這種情況下,我將在瀏覽器中得到輸出,如...

myfile.txt 
mykey : myvalue 

......這正是我想要的。

然而,當數據在表格2我得到的是這樣的瀏覽器中顯示的文件名...

myfile.txt 

...但我想獲得的東西等等。 ..

myfile.txt 
mykeyone : myvalueone 
mykeytwo : myvaluetwo 

我需要能夠處理獲取這兩種形式的數據。更糟糕的是,我可能還應該計劃在未來的某個時間點接收超過一個或兩個鍵值對的可能性。我一直在爲此奮鬥很長一段時間。任何幫助深表感謝!

謝謝!

回答

0

嘗試做這樣的事情對於第二種形式:

for(i=0;i<v.PARAMS.PARAM.length;i++) { 
    myFormattedData += '<br />' + v.PARAMS.PARAM[i].KEY + ' : ' + v.PARAMS.PARAM[i].VALUE; 
} 
+0

我收到了很好的答案!我以各種形式嘗試了其中的幾種。我決定採取什麼措施,以及現在對我最好的工作,以及讓我爲未來的其他鍵值對做準備,是檢查Object.prototype.toString.call(v.PARAMS.PARAM) ===基於@Felix Kling評論的「[object Array]」。當它返回true時,我運行你的(Anthony Accioly)循環。當它返回false時,我只運行myFormattedData + ='
'+ v.PARAMS.PARAM.KEY +':'+ v.PARAMS.PARAM.VALUE;'。謝謝! – bgw 2011-04-27 18:39:35

0

在form1中,v.PARAMS.PARAM.KEY將爲非null。

在表格2中,它將爲空。
在這種情況下,你需要引用您的密鑰和值v.PARAMS.PARAM[0].KEYv.PARAMS.PARAM[0].VALUEv.PARAMS.PARAM[1].KEY

0

在第二個版本,v.PARAMS.PARAM是一個數組。你應該檢查它是否是一個Array,然後迭代該Array。下面的代碼只適用於表單2.如果可能從服務器返回任何一種表單,則需要將您的功能與我展示的內容混合。

function(v) 
{ 
    var myFormattedData = v.FILE; 
    if(v.PARAMS !== undefined && v.PARAMS.PARAM !== undefined && v.PARAMS.PARAM instanceof Array) 
    { 
     var l = v.PARAMS.PARAM.length, 
      current; 
     for(var i = 0; i < l; i++) 
     { 
      current = v.PARAMS.PARAM[i]; 
      if(current.KEY !== undefined && current.VALUE !== undefined) 
      { 
       myFormattedData += '<br />' + current.KEY + ' : ' + current.VALUE; 
      } 
     } 
    } 
} 
4

爲了簡化處理,請檢查PARAM對象的類型。如果它是一個數組,那麼你有類型2的響應。否則它是類型1的響應。通過在數組中包含PARAM將類型1轉換爲類型2,進一步簡化,因此可以將所有內容視爲客戶端上的數組無論服務器如何發送它。

function(data) { 
    var params = data.PARAMS.PARAM; 
    if (!(params instanceof Array)) { 
     // convert to Array to treat everything alike 
     params = [ params ]; 
    } 
    // now that we know we are always dealing with an array, 
    // loop through each item and print each key, value pair 
    params.forEach(function(param) { 
     console.log(param.KEY + ": " + param.VALUE); 
    }); 
} 
+0

+1我的想法:)替代(更復雜)陣列檢測器:'Object.prototype.toString.call(PARAMS)== =「[object Array]」 – 2011-04-27 16:37:48

+0

謝謝Felix。我在幾個地方看到過這種類型的檢測。這是因爲與IE兼容嗎? – Anurag 2011-04-27 16:44:27

+0

我問自己同樣的問題,因爲我不知道了爲什麼*這是經常使用,而不是'instanceof數組''。我google了一下,但發現只有這個:http://javascript.info/tutorial/type-detection此刻我不能說更多,對不起。 – 2011-04-27 16:52:31