var arr = {'a':fn1,'b':fn2,'c':fn3}
$.each(arr,function(name,func){
(do something particular for the last iteration)
...
})
如果不使用其他变量,那将是最好的。
修改: 我的意思是 LITERALLY 最后一个,这是我输入的最后一对。
答案 0 :(得分:32)
您的示例变量名为'arr',但它根本不是数组(它是一个对象)。这使它有点混乱。
当迭代一个对象时,就没有“last”属性,因为属性的顺序在设计上是不确定的。
在遍历数组时,您可以简单地将回调的第一个参数与(array.length-1)进行比较,以检测最后一次迭代。
在代码中(对于数组):
var arr = [ "a","b","c" ];
$.each(arr, function(i,val) { if (i == arr.length-1) ... });
答案 1 :(得分:4)
Philippe Leybaert的回答非常清楚地概述了你的问题,并且可能有更清晰的方法来做你想做的事情。但是,我说,如果不使用额外的变量,我就无法找到你所要求的方法。
var obj = { 'a': fn1, 'b': fn2, 'c': fn3 };
var lastKey;
$.each(obj, function(key, fn) {
// do stuff...
lastKey = key;
});
obj[lastKey].doStuffForLastIteration();
答案 2 :(得分:1)
如果您需要发生某些事情,请说您正在迭代单个列表,并且您希望有条件地插入另一个对象,但如果不满足条件,则需要将其插入最后,您可以执行以下操作:
$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的解决方案完全相同。如果有某种原因这不起作用,请评论并告诉我,因为我使用它。
答案 3 :(得分:0)
在这里,我提出了一个全新的,改进的答案。
一种优雅的方式可能是使用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
答案 4 :(得分:-2)
现在我已经看到了你的duplicate question - 你说的地方,“对于以下内容,它是'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];
答案 5 :(得分:-2)
当jQuery.each
函数同步时,您真的需要跟踪上次迭代吗?只需在$.each()
来电之后输入您的代码。