![](/img/trans.png)
[英]What is the difference between these two notations for Javascript objects/associative array?
[英]Javascript - What's the difference with this object definiton notations?
我试图将数组传递给jquery的.ajax()函数的data参数。 第一种方法是使我的二维数组如下所示:
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的每个元素的变量/属性(或者我错了吗?)。 但是,为什么两种方法的行为有所不同? (对不起,我可以缩短我的问题,但是我想我需要解释一下我是如何找到它的)。
编辑:我已经添加了初始化(arr [i] = new Array();)。 在编辑问题时,我一定已经删除了它。 但是仍然是同样的问题。
那是因为您没有初始化数组元素。
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 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
,它们将被切换。
var arr = new Array(); for(i in someArray){ arr[i].lon = "x"; arr[i].lat = "y"; }
给出错误。 因为对于任何i, arr [i]始终是未定义的。
在第二种情况下,您正在创建一个新的对象并将其分配给arr [i]
问题在于,在第一种方法中,您没有在尝试设置对象的属性之前将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] = {}
。 只有对象获得“扩展属性”,在这里您只是将内容分配给myObject.propertyName
,而对象突然具有propertyName
属性。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.