【问题标题】:How to catch last iteration inside $.each in jQuery?如何在 jQuery 中捕获 $.each 中的最后一次迭代?
【发布时间】:2009-09-09 11:04:44
【问题描述】:
var arr = {'a':fn1,'b':fn2,'c':fn3}

$.each(arr,function(name,func){
(do something particular for the last iteration)
...
})

最好不使用其他变量。

编辑: 我的意思是LITERALLY最后一个,这是我输入的最后一对。

【问题讨论】:

  • 为什么你需要知道它什么时候是最后一个元素?也许有更简单的解决方案。
  • 请注意,您的arr 是一个对象,JavaScript 中的对象成员没有保证顺序。所以实际上没有“最后一个”项目。
  • 为什么他必须证明一些在 javascript 规范中的东西?根据规范,字面意思是:“枚举属性的机制取决于实现。枚举的顺序由对象定义。”
  • @Philippe Leybaert:我想说那是 OP 正在寻找的“证据”——而是呼吁引用。
  • 不,不是。对于任何对象,无论它是如何创建的,它都是未定义的。

标签: javascript jquery properties


【解决方案1】:

您的示例变量名为“arr”,但它根本不是一个数组(它是一个对象)。这让人有点困惑。

当迭代一个对象时,没有“最后一个”属性这样的东西,因为属性的顺序在设计上是不确定的。

对数组进行迭代时,只需将回调的第一个参数与 (array.length-1) 进行比较即可检测最后一次迭代。

在代码中(用于数组):

var arr = [ "a","b","c" ];

$.each(arr, function(i,val) { if (i == arr.length-1) ... });

【讨论】:

  • 还想知道为什么它会被否决...如果有什么问题,请告诉我们原因(否则我们如何学习?)
  • 我没有投反对票,但你真的没有回答他的问题。在循环外使用一个额外的变量,您可以检测到最后一次迭代的键是什么。他想要一种没有额外变量的方法。迭代顺序并不总是相同并不重要,通常您只需要知道最后一个即可决定在生成文本或其他内容时是否要添加逗号或句点。
  • @Lance:如果你仔细阅读这个问题,你会发现 OP 真的很想知道对象中的最后一个属性是什么:引用:“我的意思是最后一个,这是最后一对是我输入的。”
【解决方案2】:

Philippe Leybaert 的回答很好地概述了您问题的问题,并且可能有一种更清晰的方式来做您想做的事情。但话虽如此,如果不使用额外的变量,我看不出有一种方法可以满足您的要求。

var obj = { 'a': fn1, 'b': fn2, 'c': fn3 };
var lastKey;

$.each(obj, function(key, fn) {
    // do stuff...
    lastKey = key;
});

obj[lastKey].doStuffForLastIteration();

【讨论】:

    【解决方案3】:

    如果您需要发生某些事情,假设您正在迭代单个列表,并且您希望有条件地插入另一个对象,但如果不满足条件,您需要最后插入它,您可以执行以下操作:

    $list = $({{some_selector}});
    $list_elt = $({{some_html}})
    $list.each(function (i) {
        if ({{condition is met}}) {
             $(this).before($list_elt);
             return false;
        }
        else if (i == $list.length - 1) {
            $(this).after($list_elt);
            return false;
        }
    });
    

    这与 Philippe 的解决方案是一回事,真的。如果由于某种原因这不起作用,请发表评论并让我知道,因为我使用它。

    【讨论】:

      【解决方案4】:

      在这里,我提出了一个全新的、改进的答案。

      一种优雅的方法是使用after() 函数包装器。代码如下:

      function after(fn, times){
         return function(){
           if(--times === 0){
             var args = Array.prototype.slice.call(arguments);
             fn.apply(this, args);
           }
         };
       }
      

      fn 是你最后要执行的函数,times 是你等待的不同响应的数量。

      after() 包装您的函数并创建一个新函数,该函数仅在 times 调用后运行其代码。下面是一个简短的例子:

      function onLastResponse(foo){
        console.log('this is last iteration');
      }
      
      var myCallback = after(onLastResponse, 3);
      
      myCallback(); //not executed
      myCallback(); //not executed
      myCallback(); //executed
      

      查看此 jsbin 以获取实时示例:https://jsbin.com/sufaqowumo/edit?js,console

      【讨论】:

        【解决方案5】:

        现在我已经看到了您的 duplicate question - 您在其中声明“对于以下内容,它是 'c':fn3” - 看来您可能是在 maximum 属性的值之后一个对象。

        var obj = { 'a': fn1, 'b': fn2, 'c': fn3 };
        
        var maxKey;
        for (var key in arr) {
            if (!(maxKey > key)) {
                maxKey = key;
            }
        }
        
        // fn will be fn3
        var fn = obj[maxKey];
        

        【讨论】:

          【解决方案6】:

          作为jQuery.each函数同步,你真的需要跟踪上次迭代吗?只需将您的代码放在$.each() 调用之后即可。

          【讨论】:

          猜你喜欢
          • 2017-12-04
          • 1970-01-01
          • 1970-01-01
          • 2012-06-01
          • 2015-09-28
          • 1970-01-01
          • 1970-01-01
          • 2010-12-14
          • 2012-10-17
          相关资源
          最近更新 更多