2011-02-26 70 views
0

我試圖將一個數組傳遞給jquery的.ajax()函數的數據參數。第一種方法是,我做我的2維數組是這樣的:Javascript - 這個對象定義符號有什麼區別?

var arr = new Array(); 
for(i in someArray){ 
     arr[i] = new Array(); 
    arr[i].lon = "x"; 
    arr[i].lat = "y"; 
} 

然後我試圖通過以此爲數據$阿賈克斯()

$.ajax({ 
    data: { vals : arr }, 
    async: false, 
    type: "POST", 
    url: "namedb.php", 
    dataType: "script", 
    success: function(data){ 
     result = data; 
     alert(result); 
     } 
}); 

測試.php只是返回所有值$ _POST。所以警報()這裏返回:

Array 
(
) 

但是,如果我改變了代碼:

var arr = new Array(); 
for(i in someArray){ 
     arr[i] = new Array(); 
    arr[i] = { lon: "x", lat: "y" }; 
} 

警報()返回我的預期:

Array 
(
    [vals] => Array 
     (
      [0] => Array 
       (
        [lat] => "y", 
        [lon] => "x" 
       ) 
      ... 
     ) 
) 

我知道這兩種方法初始化每個元素的變量/屬性arr (或者我錯了嗎?)。但爲什麼2方法的行爲不同? (抱歉,我可以縮短我的問題,但我想我需要解釋我是如何找到它的)。

編輯:我已經添加了初始化(arr [i] = new Array();)。在編輯問題的過程中,我一定把它擦掉了。但仍然是同樣的問題。

+0

您可以加入你的'從OP,「援引test.php'代碼 – 2011-02-26 08:13:23

+0

test.php的只是返回所有$ _POST「的值,以便代碼可以是<?php print_r($ _ POST);' – Thai 2011-02-26 08:22:46

+0

@Thai。是的,就是這麼簡單。 – Jairo 2011-02-26 08:25:25

回答

5

那是因爲你沒有初始化數組元素。

var arr = new Array(); 
for(i in someArray){ 
    arr[i] = {}; // initialize it! 
    arr[i].lon = "x"; 
    arr[i].lat = "y"; 
} 

其實,我喜歡寫

var arr = new Array(); 
for(i in someArray){ 
    arr[i] = { lon: "x", lat: "y" }; 
} 

因爲我不必鍵入arr[i] 3倍。


使用for in遍歷數組是不對的,你應該使用for循環或jQuery的$.each

var arr = []; 
for(var i = 0; i < someArray.length; i ++) { 
    arr[i] = { lon: "x", lat: "y" }; 
} 

或者

var arr = []; 
$.each(someArray, function(i, value) { 
    arr[i] = { lon: "x", lat: "y" }; 
}); 

使用Array.prototype.push添加的東西到一個數組比較容易,因爲你不需要知道數組的下一個索引,也可以與arr[arr.length]=something進行比較。

var arr = []; 
$.each(someArray, function(i, value) { 
    arr.push({ lon: "x", lat: "y" }); 
}); 

現在你正在做的是從數組中收集數據並將其轉換爲另一個數組。 jQuery已經有一個這樣的功能:$.map

var arr = $.map(someArray, function(value, i) { 
    return { lon: "x", lat: "y" }; 
}); 

注意,使用$.each時,參數是i, value,當您使用$.map,他們被切換。

+1

一個非常全面的答案; OP可能會從中學習:)。特別是''in'循環對數組不好。但是,請記住,他顯然給了我們一個玩具問題;試圖以最佳方式解決問題並不總能很好地利用您的回答時間。 – Domenic 2011-02-26 08:20:37

+0

我編輯過它,初始化包括在內。對不起,我一定在編輯問題的時候把它擦掉了。我現在加了它。 – Jairo 2011-02-26 08:26:32

+1

@Jairo然而,你將它初始化爲一個數組,並且JavaScript中的數組用於順序列表,而數組的內容是具有數字屬性名稱的屬性,所以設置'.x'和'.y'不會修改數組的內容,因此它仍然是一個空數組。您應該使用'new Object()'或'{}'將它初始化爲一個對象。 – Thai 2011-02-26 08:35:15

0

問題是,在第一種方法中,在嘗試設置其屬性之前,您沒有初始化arr[i]對象。事實上,我認爲你應該在調試控制檯中得到JavaScript錯誤。以下將工作:

var arr = new Array(); 
for(i in someArray){ 
    arr[i] = {}; // or "new Object()" 
    arr[i].lon = "x"; 
    arr[i].lat = "y"; 
} 

FYI使用new Array()是不好的做法;最好使用var arr = []。同樣,這就是爲什麼我使用arr[i] = {}而不是arr[i] = new Object()

編輯根據您的編輯,您添加了行arr[i] = new Array()。那麼,陣列沒有lonlat屬性,所以試圖設置它們將不起作用!您需要使用arr[i] = new Object()或(更好)arr[i] = {}。只有對象會獲得「expando屬性」,您只需將對象分配給myObject.propertyName並且該對象突然具有propertyName屬性。

+0

1)不要使用'for..in'來迭代Array實例。 2)簡潔的形式:'arr [i] = {lon:「x」,lat:「y」};' – 2011-02-26 08:18:34

+1

是的Ates,OP已經意識到簡潔的形式,因爲他在第二個展示給我們例如,並試圖找出爲什麼他的「非簡明」形式的版本不起作用。是的,對於這個玩具的例子來說''in''是不好的,但是我認爲他原來的問題更復雜,也許在那裏是有意義的。 – Domenic 2011-02-26 08:21:50

+0

對不起。它確實有初始化。我現在要編輯這個問題。謝謝 – Jairo 2011-02-26 08:23:04

1
 
var arr = new Array(); 
for(i in someArray){ 
    arr[i].lon = "x"; 
    arr[i].lat = "y"; 
} 

給出錯誤。因爲對於任何i,arr [i]始終爲undefined

在第二種情況下,你要創建一個新對象並將其分配給Arr [I]