Javascript - 这个对象定义符号有什么区别?

标签 javascript jquery ajax post

我正在尝试将数组传递给 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 每个元素的变量/属性(或者我错了?)。但为什么两种方法的行为不同呢? (抱歉,我可以缩短我的问题,但我想我需要解释一下我是如何找到它的)。

编辑:我添加了初始化(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 循环或 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时,它们会被切换。

关于Javascript - 这个对象定义符号有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5125786/

相关文章:

php - 如何在提交时从侧栏中的mysql获取搜索结果而不刷新页面

javascript - Cloud Functions - Cloud Firestore 错误 : can't get serverTimestamp

javascript - Firebase/Parse 可以在每天的特定时间运行代码吗?

jquery - 光滑的垂直滚动和覆盖

javascript - 如何在用户完成输入表单时更改 div 的背景(如进度条)?

php - session 处理类奇怪的行为

javascript - 我想在文件上传按钮上打开特定文件夹

javascript - 当我给他们 ID 时 SQL 没有更新

javascript - jQuery 只能在 .html 文件中工作,而不能在 .PHP 文件中工作?

javascript - 单击按钮时元素未隐藏