2012-12-26 65 views
1

我有一個JavaScript應用程序,它調用api,並且api返回json。用json,我選擇一個特定的對象,然後循環。如何將json/object轉換爲數組循環

我的代碼流是這樣的: 服務電話 - > GetResults 遍歷結果,並建立第

的問題,雖然,有時該API只返回一個結果,因此,這意味着它返回一個對象,而不是的數組,所以我無法循環查看結果。什麼是最好的方法來解決這個問題?

我是否應該將我的對象或單個結果轉換爲一個arrary?把/推入陣列內?或者我應該做一個typeof並檢查元素是否是一個數組,然後做循環?

感謝您的幫助。

//this is what is return when there are more than one results 
var results = { 
pages: [ 
     {"pageNumber":204}, 
     {"pageNumber":1024}, 
     {"pageNumber":3012} 
    ] 
} 

//this is what is returned when there is only one result 
var results = { 
    pages: {"pageNumber": 105} 
} 

我的代碼循環遍歷結果,只是使用for循環,但它會產生錯誤,因爲有時結果不是數組。那麼,我是否要檢查它的數組?將結果推送到新的數組中?什麼會更好。由於

+3

你能給我們一個你的JSON對象是什麼樣子的例子嗎? – Shmiddty

+1

你對服務器端組件有任何控制嗎?你有沒有機會使用SoapClient? –

+1

*將單個對象立即轉換爲數組。*然後處理一個元素的數組,與n個元素的數組沒有區別。容易:)當然,我會爭辯說,相同的集合結構應該*總是*從Web服務返回(即使對於一個單一的元素),但這是一個不同的主題.. – 2012-12-26 23:36:36

回答

6

如果你有在服務器端沒有控制,你可以做一個簡單的檢查,以確保它是一個數組:

if (!(results.pages instanceof Array)) { 
    results.pages = [results.pages]; 
} 

// Do your loop here. 

否則,最好應在服務器上發生的;它應該是合同的一部分,結果總是可以以類似的方式訪問。

0

將你對循環內部對象做的任何事情安排到一個單獨的過程中,如果你發現該對象不是數組,則直接對其應用該過程,否則將其多次應用於該對象的每個元素:這種方法相比之一,在那裏你創建一個冗餘磁盤陣列是,好了,你沒有創建一個冗餘磁盤陣列,你不修改您接收到的數據作爲

function processPage(page) { /* do something to your page */ } 

if (pages instanceof Array) pages.forEach(processPage); 
else processPage(pages); 

好處顯而易見。在這個階段,數據可能並不重要,一般來說,在運行集成和迴歸測試時,可能會給您帶來更多麻煩。