2011-06-02 114 views
3

我在轉換某些JSON時遇到了一些問題,並且我得到了一些幫助。這是我的問題,我已經JSON返回以下內容:JSON的收到(從CSV文件)Javascript對象到數組

例子:

[ 
    { 
     "rating": "0", 
     "title": "The Killing Kind", 
     "author": "John Connolly", 
     "type": "Book", 
     "asin": "0340771224", 
     "tags": "", 
     "review": "i still haven't had time to read this one..." 
    }, 
    { 
     "rating": "0", 
     "title": "The Third Secret", 
     "author": "Steve Berry", 
     "type": "Book", 
     "asin": "0340899263", 
     "tags": "", 
     "review": "need to find time to read this book" 
    }, 

    cut for brevity 

] 

現在,這是對象的一個​​一個維數組,但我有一個函數,我需要通過這個將只需要一個多維數組。我無法改變這一點。我一直在網上尋找周圍的轉換和整個這個代碼就來了:

if (! obj.length) { return [];} // length must be set on the object, or it is not iterable 
    var a = []; 

    try { 
     a = Array.prototype.slice.call(obj, n); 
    } 
    // IE 6 and posssibly other browsers will throw an exception, so catch it and use brute force 
    catch(e) { 
     Core.batch(obj, function(o, i) { 
      if (n <= i) { 
       a[i - n] = o; 
      } 
     }); 
    } 

    return a; 

但我的代碼一直陷在「無對象長度」的一部分。當我遍歷每個對象時,我逐字逐句逐字。不幸的是,這些字段名稱(評級,標題,作者)等沒有設置,我無法使用obj.Field標記訪問任何內容。

我被困在這個;有沒有辦法將這些對象轉換爲數組,還是我必須返回到開頭並轉儲JSON?

+1

到底你想如何「轉換」對象?換句話說,結果數組需要看起來像什麼?對此沒有單一的答案。它可能是很多不同的東西,但是你需要調用的這個函數需要特別的東西。 – Pointy 2011-06-02 13:38:06

回答

4

有一個很好的JavaScript庫稱爲Undersore.js其完成所有類型的對象/數組操作。

使用它,因爲這

_(json).each(function(elem, key){ 
    json[key] = _(elem).values(); 
}); 
+0

這解決了我的問題,非常感謝! – Speedy 2011-06-02 14:17:32

4

如果我理解正確,您需要知道兩件事才能實現此目標。

其中一個事實是object.member也可以寫成object["member"]。這意味着您不必將您的屬性名稱硬編碼到陣列轉換器的對象中,但可以將它們視爲字符串。

第二個是for-in聲明(請參閱section 12.6.4)。對於一個對象,這遍歷所有的成員。

下面將導致innerArray是包含所有對象

var innerArray = []; 
for (property in object) { 
    innerArray.push(object[property]); 
} 

的所有成員利用這些知識的值的數組,你可以定製陣列包含它的任何信息,你需要從json對象中提取。

0

這將輸出:

var newJSON = []; 

for (var i = 0, len = json.length; i < len; i++) 
{ 
    newJSON.push([json[i]]); 
} 

進...

[ 
[Object { rating="0", title="The Killing Kind", more...}], 
[Object { rating="0", title="The Third Secret", more...}] 
] 

小提琴:http://jsfiddle.net/Ta6hW/

0

有一個簡單的方法來做到這一點

用一維的對象,你可以做轉換一樣容易:

var myarrayfromobject = new Array(); 
$H(myobject).each(function(item, i){ 
    myarrayfromobject[i] = item; 
}); 

如果你有一個多維的對象,你可以使用同樣的想法,使用遞歸函數或循環,驗證項目的類型。