【问题标题】:Iterating thru array values using $.each not working使用 $.each 遍历数组值不起作用
【发布时间】:2013-01-17 19:21:19
【问题描述】:

我一直在试图弄清楚如何通过以下代码进行迭代。

var arr = []

$.ajax({

 type: 'POST',
   dataType: 'html', 
   url:   '/test/public/index/getid', 
   success: function(response) {
        response = $.parseJSON(response)
        $.each(response, function(index, value) {
             arr.push(value)

        });
   }

});

console.log(arr)

$.each(arr, function(index0, value0) {

console.log('INDEX0: ' + value0);

});

这会给我一个关于 firebug 的 [ ] ,我可以扩展它。然后它有 0 和 1 并显示 ids

[ ]

0 1234343

1 2343223

2 414234

3 232342

但稍后在程序中,我尝试使用 $.each 循环它,但它不会读取它。

我试图在通过 console.log 打印时使 arr 看起来像这样。

[“1234343”、“2343223”、“414234”、“232342”]

里面的值是在第一个循环中推送的 id。

知道如何做到这一点吗?尝试获取 arr.length 并将其用作测试条件。

原始 JSON 响应: [“1234343”、“2343223”、“414234”、“232342”]

【问题讨论】:

  • 你能发布response的原始JSON吗?
  • 还发布此代码:“稍后在程序中我尝试使用 $.each 循环它,但它不会读取它。”
  • "...稍后在程序中我尝试循环通过它",什么是"它"?
  • 刚刚添加了下一个代码以及原始 json 响应
  • 你试过把console.log放到success函数里面吗?按照现在的设置方式,控制台日志将在 ajax 请求返回之前执行,因此它将始终显示为 []。尝试为您的数组计数设置一个全局变量并默认为 0,然后在您成功(在每个之后)重新计算数组的长度

标签: jquery arrays each


【解决方案1】:

Ajax 是异步的,不要尝试在成功回调之外访问 ajax 请求中的数据。

$.ajax({
   type: 'POST',
   dataType: 'json', 
   url: '/test/public/index/getid', 
   success: function(arr) {
       console.log(arr);
   }
});

你也可以这样做:

var request = $.ajax({
    type: 'POST',
    dataType: 'json', 
    url: '/test/public/index/getid'
});
request.done(function(arr){
    console.log(arr);
});

第二种方法可以让您传递request 并在任何需要的地方使用它,只需执行以下操作:

request.done(function(arr){
    // do something with arr
    console.log(arr)
});

cmets 更新,

如果请求 2 依赖于请求 1,请使用以下结构:

var request1 = $.ajax({...});

request1.done(function(){
    var request2  = $.ajax({...});
    request2.done(function(){
        // both are done, do stuff
    });
});

或者如果你想发送请求 1 和 2,然后在两者都完成后做一些事情,你可以这样做:

var request1 = $.ajax({...});
var request2 = $.ajax({...});
$.when(request1,request2).done(function(req1,req2) {
    // do stuff
});

【讨论】:

  • 好的,这给了我想要的数组。所以为了将来的使用,每个ajax请求都应该有一个变量吗?我需要在 ajax 调用中进行 ajax 调用并尝试比较两个会话变量,希望这可以工作。
  • 是的,你可以一个接一个地发送,这样它们都同时发送,然后在它们都完成后处理它们,或者你可以发送一个,然后发送第二个第一个的.done。
  • 你有这方面的例子吗?我能够使用不同的解决方案解决与此相关的另一个问题,但我可以看到这种方法在某些时候会变得很方便。
  • 好的,非常感谢这些示例。那么你可以在 ajax 调用中嵌套 ajax 调用并将响应操作到 jquery 数组中,然后比较数组或使用它们吗?
【解决方案2】:
var arr = []

var callback = function(arr){
       console.log(arr);
};

$.ajax({

 type: 'POST',
   dataType: 'html', 
   url:   '/test/public/index/getid', 
   success: function(response) {
        response = $.parseJSON(response)
        $.each(response, function(index, value) {
             arr.push(value)

        });
        callback(arr);
   }
});

为什么不这样做呢?

你的主程序执行。

  • 您定义了一个数组
  • 然后进行 ajax 调用
  • 然后记录 arr。

第二步是异步过程,主程序执行不会因为ajax调用而停止,不管ajax调用是否完成都会继续执行。因此,在执行 console.log(arr) 时,您的 ajax 调用可能/可能不会返回,留下一个空的 arr 变量来记录到控制台。这可能是您看不到任何内容的原因,因为记录了一个空数组。

使用回调函数,您可以确保仅在 ajax 调用返回并且您已填充 arr 时将 arr 记录到控制台。

【讨论】:

  • 试过这段代码,但语法有问题,导致我在参数列表后出现错误)
  • 我删除了一个多余的},再试一次。
  • 是的,这行得通,就像@mistersender 提到将console.log 放在成功函数中一样。但我需要的是有一个数组,该数组将该格式保持在该成功函数之外,并且第二个每个都可以通过它进行解析,并获得一个长度以用于进一步的条件。
  • arr 应该可以在任何条件下调用,如果它在文档准备好的情况下被实例化。我的问题是,如果它实际上返回一个数组,为什么我们要在成功函数内部执行每个循环。不应该只是成功函数(响应){ arr = response} 吗?
  • arr 实际上在回调函数之外可用,唯一的事情是您必须确保在您访问 arr 时调用以某种方式返回。
猜你喜欢
  • 2015-03-03
  • 1970-01-01
  • 2019-03-18
  • 2018-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多