【问题标题】:Return a value with jQuery each() function使用 jQuery each() 函数返回一个值
【发布时间】:2011-10-19 23:59:41
【问题描述】:

我是 javascript 新手,我想从 JSON 中检索值并将其推送到一个数组中,以便我可以在另一个函数中再次解析该数组,但我不知道如何在推送后返回该数组里面的元素。

在以下脚本中,我无法在项目中显示值

function gC(b,c,p) {

    $.getJSON('getmonths', 'b='+b+'&c='+c+'&p='+p, processJSON);    
}

function processJSON(data) {
      var retval = [];
      $.each(data, function(key, val) {

          retval.push(val); 
          //alert(retval.pop());
      });
      return retval;
}

    $(document).ready(function(){
       var b = $("#b").val();
       var c = $("#c").val();
       var p = $("#p").val();

       var items = [];

       items = gC(b,c,p);
       var i = 0;

       $('td').each(function(index) {
          $(this).attr('bgcolor', items[i]);
          i++;
       }

如何访问数组?

谢谢!

【问题讨论】:

    标签: javascript jquery arrays json


    【解决方案1】:

    您不会从 AJAX 调用中返回,而是在完成后调用回调函数。

    function gC(b,c,p) {
        var retval = [];
        $.getJSON('getmonths', 'b='+b+'&c='+c+'&p='+p, processData);
    }
    
    function processData(data){
      var retval = [];
      $.each(data, function(key, val) {
          retval.push(val); 
          //alert(retval.pop());
      });
      alert(retval);
    }
    

    processData 将在 AJAX 调用完成时被调用。这不能将值返回给另一个函数,所以你所有的逻辑都必须在这个回调函数中。

    更新:您还可以将回调函数传递给gC,以便在完成后调用。

    function gC(b,c,p,f) {
        var retval = [];
        $.getJSON('getmonths', 'b='+b+'&c='+c+'&p='+p, function(d){
           if(typeof f == 'function'){
             f(d);
           }
        });
    }
    

    然后你像这样调用gC

    gC(b,c,p,function(data){
        var retval = [];
        $.each(data, function(key, val) {
            retval.push(val); 
            //alert(retval.pop());
        });
        alert(retval);
    });
    

    UPDATE2:我看到了您添加到问题中的代码。这需要在回调中完成。

    gC(b,c,p,function(data){
        var items = [];
        $.each(data, function(key, val) {
           items.push(val);
        });
        $('td').each(function(index){  // You don't need a separate i variable
                                       // you can just use the index from the loop
          $(this).attr('bgcolor', items[index]);
       }
    })
    

    【讨论】:

    • 当然你可以给gC添加一个额外的参数,这样如果你需要在不同的地方对数组做不同的事情,你就可以传入一个回调函数。
    • 感谢您的回复,但问题仍然存在,我该如何从 processData 返回值?因为一旦我解析了 JSON 对象,我就会切换页面的计算元素类(通过解析它们)并且我必须重新解析 processData() 结果以在每个切换元素上设置值
    • @Jerec:你需要改变你的逻辑。你不能退回任何东西。您必须在回调函数中切换类。
    • 问题在于,由于这是一个异步调用,alert(items); 将在$.getJSON 有机会填充它之前执行,因此当时项目将为空。正如 Rocket 所建议的,您需要在回调中完成您的工作,这样才能确保通过 ajax 调用检索到数据。
    【解决方案2】:

    只需将代码放在回调中即可:

    function processJSON(data) {
        var retval = [];
        $.each(data, function(key, val) {
            retval.push(val); 
        });
        $('td').each(function(index) {
            if (index < retval.length)
                $(this).attr('bgcolor', retval[index]);
        });
    }
    

    【讨论】:

      猜你喜欢
      • 2012-09-10
      • 2011-08-26
      • 1970-01-01
      • 2012-04-04
      • 2015-07-30
      • 2015-07-10
      • 1970-01-01
      • 2013-06-18
      • 1970-01-01
      相关资源
      最近更新 更多