2009-09-09 343 views
18
var arr = {'a':fn1,'b':fn2,'c':fn3} 

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

如果沒有使用其他變量,這將是最好的。

編輯: 我的意思是LITERALLY最後一個,這是最後一對我鍵入。

+1

爲什麼,所以你需要知道什麼時候它的最後一個元素?也許有一個更簡單的解決方案。 – Gumbo 2009-09-09 11:08:02

+5

請注意,您的'arr'是一個對象,JavaScript中的對象成員沒有保證的順序。所以實際上沒有「最後」項目。 – Fabian 2009-09-09 11:16:24

+0

@Fabian Neumann,你能證明嗎? – omg 2009-09-09 11:46:55

回答

32

您的示例變量稱爲'arr',但它根本不是數組(它是一個對象)。這使它有點混亂。

當遍歷一個對象時,不存在「last」屬性,因爲屬性的順序未由設計定義。

在迭代數組時,可以簡單地比較回調的第一個參數和(array.length-1)來檢測最後一次迭代。

在代碼(陣列):

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

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

你可以在代碼中「說」嗎? – omg 2009-09-09 11:14:57

+0

爲什麼這會被投票? – rahul 2009-09-09 11:17:01

+0

我也想知道... – 2009-09-09 11:17:29

4

菲利普Leybaert的回答概括你的問題的問題非常好,而且有可能是做你想要的東西更清晰的方式。但是,那說,我不能看到一種方法來做你所要求的,而不使用額外的變量。

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

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

obj[lastKey].doStuffForLastIteration(); 
-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]; 
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; 
    } 
}); 

這是菲利普的解決方案,真的是一回事。如果出於某種原因,這不應該起作用,請評論並讓我知道,因爲我使用它。

-2

正在jQuery.each函數同步,你真的需要跟蹤最後一次迭代嗎?只需在$.each()調用後放置您的代碼即可。

+1

在每個內部完成的事情可能不會是...... – Dan 2014-12-31 19:33:58

+0

如果在'$ .each'裏面有一個Ajax調用,那麼異步 – 2015-10-07 15:16:10

+0

@Reddy我剛剛輸入了一個改進的答案,請查看http://stackoverflow.com/問題/ 1399004 /如何到追趕最後的迭代,由內各功能於jQuery的/ 33016252#33016252 – balanza 2015-10-08 12:47:19

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

相關問題