2012-04-13 87 views
2

我一直在掙扎了一會兒:for()中的最後一個循環?

for(var key in obj){ 
    blah.blah() 
    if(choice){ 
     doThis(); 
    } 
} 

如何,我只在最後一個項目叫doThis()?由於我沒有櫃檯,i,我無法確定哪個是最後一個項目。

+0

有沒有理由不使用interator'i'? – Marc 2012-04-13 02:07:30

+0

我正在循環一個對象。 (')':( – 2012-04-13 02:08:09

+0

)中沒有定義'i'是否有任何理由需要在循環中調用'doThis'?key的值將是循環的最後一個鍵的值完成,你知道,因爲你使用'var'而不是'let' – 2012-04-13 02:16:56

回答

8

首先,鑰匙不保證順序。通過規範,密鑰是無序的。如果你真的想用你最後一把鑰匙做點什麼,你可以這樣做;

var lastkey; 
for(var key in obj){ 
    lastkey = key; 
    blah.blah() 
} 
if(choice){ 
    // use lastkey if you want 
    doThis(); 
} 
+0

+1很好的使用'lastKey',因爲如果'var'改變爲'let',那麼在循環之後只用'key'依賴於'var'的塊範圍的缺乏。 – 2012-04-13 02:18:59

0

你給的代碼將被轉換爲:

for(var key in obj){ 
    blah.blah() 
} 
doThis(); 

如果這不起作用,請解釋爲什麼在你的問題。

1

隨着該jfriend00在他的回答中提到需要提醒的是鑰匙不保證順序來,這裏是最普遍的轉變,以增加:

  • 任意for循環
  • 的任意while循環
  • 任意基於回調的迭代器像[].forEach

在環形塊的核心,我們的變量isLasttrue如果它是最後一個,或者false如果不是:

var toDo = function(){}; 
forOrWhile(...) { 
    toDo(false); 
    toDo = function(isLast) { 
     // blah.blah(); console.log('visited key '+key+' with value '+obj[key]+' where isLast='+isLast) 
    }; 
} 
toDo(true) 

(如果您需要捕獲迭代器的值,則需要像平常一樣在JavaScript中封閉(Google for javascript for loop for closed)。如果它是一個Array,你可以免費得到這個,那麼你可以使用[].map(function(){...}).forEach(function(){...}),這就是爲什麼框架的foreach(object)等價物是有用的;他們通常也會通過.hasOwnProperty過濾掉「原型垃圾」。)

相關問題