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

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

追加の変数が使用されていない場合に最適です。

EDIT: 私はそれらを入力し、最後のペアであるLITERALLY最後の1を意味します。

+1

?たぶん、より単純な解決策があります。 – Gumbo

+5

あなたの 'arr'はオブジェクトであり、JavaScriptのオブジェクトメンバーは保証された順序を持っていないことに注意してください。実際には「最後の」アイテムはありません。 – Fabian

+0

@Fabianノイマン、それを証明できますか? – omg

答えて

32

あなたの変数は 'arr'と呼ばれますが、配列ではありません(オブジェクトです)。これはちょっと混乱させます。

オブジェクトを反復処理するとき、プロパティの順序は設計によって定義されていないため、「最後」のプロパティはありません。

配列を反復処理するときは、コールバックの最初のパラメータを(array.length-1)と比較して、最後の反復を検出するだけです。コードで

(配列用):

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

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

あなたは「コード」でそれを言うことができますか? – omg

+0

なぜこれが投票されたのですか? – rahul

+0

私も –

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

は、あなたが単一のリストを反復処理していると言うと、あなたは条件付きで挿入されるように別のオブジェクトを望んでいたが、条件が満たされない場合は、あなたが何かを行うことができ、最後に挿入することが必要like:

$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

+0

私は改善の答えを入力してasyncronous –

+0

@Reddy .each' '$内部のAjax呼び出しがある場合は、それをチェックアウト何http://stackoverflow.com/ ...ではないかもしれません質問/ 1399004/jquery内の最後の反復方法/ 33016252#33016252 – balanza

0

ここで私は全く新しい、改善された答えを提案します。

洗練された方法では、after()関数ラッパーを使用することができます。ここでは、コードです:

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

fntimesがあなたを待っている異なる応答の数である、あなたが最後に実行したい機能です。

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

あなたはそれが最後の要素だ時に知っておく必要がありますなぜそんなに
関連する問題