2012-03-15 94 views
2

JSON字符串:(響應)構建JavaScript陣列,但具有空值

{"19":{"id":"19","name":"Product","sku":123,"price":"59.50","cost":"25.00"},"20":{"id":"20","name":"Test","sku":456,"price":"50.00","cost":"40.00"}} 

JavaScript代碼:

var json = $.parseJSON(response); 
    var items = new Array(); 

    $.each(json, function(index, value){ 
    items[index] = value.id; 
    }); 

    console.log(items); 
    // returns [ , , , , , , , , , , , , , , , , , , , 19, 20 ]  

我的影片最初是從一個PHP數組建立和使用json_encode轉換JSON對象。當我遍歷對象 - 根據某些值構建一個新數組時,它與所有第一項一樣爲null,然後最後兩個具有實際的id。

任何想法我做錯了什麼?

+1

您正在構建一個名爲'19'和'20'的屬性。使用'['和']'創建一個數組。 – nybbler 2012-03-15 18:34:05

+0

你說JSON是從一個PHP數組轉換來的,但是JSON是一個不是數組的對象。如果你期望一個數組,你需要修復PHP。如果你想在該對象的javascript中使用ID數組,可以在$ .each中使用items.push(value.id)。 – Dampsquid 2012-03-15 18:42:25

回答

2

這是因爲您使用的數組爲items。當您設置items[19]時,需要先設置值0-18(這些值爲「空」值)。這是因爲JavaScript沒有關聯數組,只有數字。

嘗試使用對象代替items

var items = {}; 

$.each(json, function(index, value){ 
    items[index] = value.id; 
}); 

console.log(items); // {19: 19, 20: 20} 

P.S.數組中的「null」項目實際上是undefined

2

當您使用對象的索引時,您正在創建一個稀疏數組。該對象具有名爲「19」和「20」的屬性,並且將這些屬性用作數組中的索引時,這就是您將從屬性中獲取值的位置。

如果要打包從數組開始的項目,只需push他們:

$.each(json, function(index, value){ 
    items.push(value.id); 
}); 

結果在items

[ "19", "20" ] 
1

你也可以改變JSON響應陣列,如果可能的話:

[ 
    {"id":"19","name":"Product","sku":123,"price":"59.50","cost":"25.00"}, 
    {"id":"20","name":"Test","sku":456,"price":"50.00","cost":"40.00"} 
] 
0

MDN

當設置一個JavaScript陣列上的屬性時,屬性是一個有效的數組索引和索引是陣列的當前範圍之外,陣列將增長到足夠大的尺寸以容納一個元件該索引,引擎將相應地更新陣列的長度屬性:

您正在將數組[19]設置爲一個值,因此數組[0-18]變爲未定義。

要解決此問題,請將項目聲明爲對象,而不是自動填充較低範圍,可以指定數字屬性。