2011-02-26 69 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]