我正在尝试将数组传递给jquery的 .ajax()函数的数据参数。第一种方法是我制作了这样的二维数组:
var arr = new Array();
for(i in someArray){
arr[i] = new Array();
arr[i].lon = "x";
arr[i].lat = "y";
}
然后我尝试将其作为 $。ajax()中的数据传递:
$.ajax({
data: { vals : arr },
async: false,
type: "POST",
url: "namedb.php",
dataType: "script",
success: function(data){
result = data;
alert(result);
}
});
test.php 只返回 $ _ POST 的所有值。所以 alert()返回:
Array
(
)
但是,如果我将代码更改为:
var arr = new Array();
for(i in someArray){
arr[i] = new Array();
arr[i] = { lon: "x", lat: "y" };
}
alert()会返回我的预期:
Array
(
[vals] => Array
(
[0] => Array
(
[lat] => "y",
[lon] => "x"
)
...
)
)
我知道两种方法都初始化 arr 的每个元素的变量/属性(或者我错了?)。但为什么2方法的表现不同? (对不起,我可以缩短我的问题,但我想我需要解释一下我是如何找到它的)。
编辑:我添加了初始化(arr [i] = new Array();)。我必须在编辑问题时删除它。但仍然是同样的问题。
答案 0 :(得分: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 :(得分:1)
var arr = new Array(); for(i in someArray){ arr[i].lon = "x"; arr[i].lat = "y"; }
给出错误。因为对于任何 i ,arr [i]始终未定义。
在第二种情况下,您正在创建一个新的对象并将其分配给arr [i]
答案 2 :(得分: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";
}
仅使用new Array()
是不好的做法;最好使用var arr = []
。同样,这就是我使用arr[i] = {}
代替arr[i] = new Object()
的原因。
编辑根据您的修改,您添加了行arr[i] = new Array()
。好吧,数组没有lon
和lat
属性,因此尝试设置它们将无效!您需要使用arr[i] = new Object()
或(更好)arr[i] = {}
。只有对象获得“expando属性”,您只需将内容分配给myObject.propertyName
,并且该对象突然具有propertyName
属性。