如何在jQuery中捕获$ .each中的最后一次迭代?
var arr = {'a':fn1,'b':fn2,'c':fn3} $.each(arr,function(name,func){ (do something particular for the last iteration) ... })
如果不使用其他变量,那将是最好的。
编辑 :我的意思是最后一个,这是我输入的最后一对。
您的示例变量名为’arr’,但它根本不是数组(它是一个对象)。 这使它有点混乱。
迭代一个对象时,没有“last”属性,因为属性的顺序是未定义的。
迭代数组时,您可以简单地将回调的第一个参数与(array.length-1)进行比较,以检测最后一次迭代。
在代码中(对于数组):
var arr = [ "a","b","c" ]; $.each(arr, function(i,val) { if (i == arr.length-1) ... });
Philippe Leybaert的答案非常清楚地概述了你的问题,并且可能有更清晰的方法来做你想做的事情。 但是,我说,如果不使用额外的变量,我无法看到你要求的方法。
var obj = { 'a': fn1, 'b': fn2, 'c': fn3 }; var lastKey; $.each(obj, function(key, fn) { // do stuff... lastKey = key; }); obj[lastKey].doStuffForLastIteration();
如果您需要发生某些事情,请说您正在迭代单个列表并且您希望有条件地插入另一个对象但是如果不满足条件则需要最后插入,您可以执行以下操作:
$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的解决方案完全相同。 如果有某种原因这不起作用,请评论并告诉我,因为我使用它。
在这里,我提出了一个全新的,改进的答案。
一种优雅的方式可能是使用after()
函数包装器。 这是代码:
function after(fn, times){ return function(){ if(--times === 0){ var args = Array.prototype.slice.call(arguments); fn.apply(this, args); } }; }
fn
是您希望最后执行的function, 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
现在我已经看到了你的重复问题 – 你在哪里陈述,“对于下面的内容,它是’c’:fn3” – 似乎你可能会追随一个对象的最大属性的值。
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];
由于jQuery.each
函数同步 ,你真的需要跟踪上一次迭代吗? 只需将代码放在$.each()
调用之后。