2013-05-10 20 views
0

我有一個算法將MVC(C#)中的對象綁定到視圖。關鍵和數據可以是任何東西,這取決於實施者。確定單個值或子數組JSON

我遇到的問題是我無法確定JSON字符串中的內容是數組還是簡單的字符串。下面的代碼遞歸地工作。如果它是一個數組,它需要深入挖掘。否則,它會綁定它根據鍵和值找到的值。

function constructView(data) 
{ 
    for(var key in data) 
    { 
     if (data[key].length > 1) 
     { 
      var count = 0; 

      while (count < data.length) 
      { 
       constructView(data[count]); 
       count++; 
      } 
     } 
     $("#" + key).html(data[key]); 
    } 
} 

這只是一個原型,所以目前它不生成組件,而只是綁定。

好了,所以,該問題:

當我通過在

{"data":"this is a response","strings":["test1","test2"]} 

它返回長度18和2。這是因爲兩者在技術上都是有效長度的數組。

有沒有辦法獲得物品的長度?它在哪裏將獨立字符串視爲1個項目,並將該陣列視爲其各自的項目計數?

我可以驗證JSON數組是否正確傳入。

任何幫助,非常感謝!

+0

所以你問如何檢查是否一個項目是數組?如果你搜索了,我確定你會找到答案。 – 2013-05-10 01:04:14

+0

我有。人們建議嘗試使用JSON.parse(),但它始終返回false,無論我從數據中如何放置[key] – 2013-05-10 01:05:11

+0

[JavaScript:檢查對象是否爲數組?](http://stackoverflow.com/ questions/4775722/javascript-check-if-object-is-array)這顯示瞭如何區分數組和字符串。 – 2013-05-10 01:06:17

回答

4
Array.isArray(x) 

將檢查數組,但如果需要支持舊版瀏覽器,則需要填充(很容易找到)。

typeof x === "string" 

將指定的字符串

+1

'foo instanceof Array'可能是一種更簡單,跨瀏覽器和向後兼容的方式;沒有polyfill需要:)。 – Matt 2013-05-10 01:08:33

+0

@Matt這應該在大多數情況下工作,但會從Array.prototype繼承的對象上失敗(授予,[嘗試子類Array帶有它自己的問題](http://perfectionkills.com/how-ecmascript-5 -still-並 - 不容許對亞類的陣列/))。 – bfavaretto 2013-05-10 01:14:23

1

在現代,ES5兼容的實現,有Array.isArray

var a = []; 
Array.isArray(a); // true 

在舊的實現需要這種醜陋的解決方法:

function isArray(a) { 
    return ({}).toString.call(a) === "[object Array]"; 
    // or: 
    // return Object.prototype.toString.call(a) === "[object Array]"; 
} 
0

見其他答案,但如果你不想擔心你看起來像polyfills已經使用jQuery(繼續使用$(...).html(...)),那麼爲什麼不使用jQuery's $.isArray() function

0

由於您使用JQuery,你可以使用:

if ($.type(data[key])==="array") 
+0

該方法對於空數組將失敗,因爲長度爲'0'將是錯誤的。此外,它會給不是數組的對象提供誤報,但它確實具有'.sort','.slice'和(非零)'.length'(例如,它會認爲非空的jQuery對象是數組當他們不是)。 – nnnnnn 2013-05-10 01:24:05

+0

我認爲這應該是因爲0長度的while循環不會運行一次。但是,是的;如果你需要用空數據完成某些工作,那麼.length應該去。我在看jQuery(大多數.net MVC應用程序使用它),$ .type檢查class2type,但還不知道如何填充。如果OP使用jQuery,他可以使用$ .type(something)===「array」 – HMR 2013-05-10 01:40:27

+0

更改我的答案,可以使用jQuery。 – HMR 2013-05-10 01:55:06