2012-04-13 141 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过滤掉“原型垃圾”。)

相关问题