2

我已经为此苦苦挣扎了一段时间:

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

我怎样才能doThis()只在最后一个项目上打电话?由于我没有柜台,i我无法确定最后一项。

4

3 回答 3

8

首先,密钥没有任何保证的顺序。根据规范,键是无序的。如果你真的想用你得到的最后一个键做某事,你可以这样做;

var lastkey;
for( var key in obj ){
    lastkey = key;
    blah.blah()
}
if(choice){
    // use lastkey if you want
    doThis();
}
于 2012-04-13T02:08:29.520 回答
1

鉴于 jfriend00 在他的回答中提到的密钥不是按保证顺序出现的警告,这里是最一般的增强转换:

  • 任意 for 循环
  • 任意while循环
  • 一个任意的基于回调的迭代器,比如[].forEach

在循环块的核心,我们的变量isLast将是true最后一个,或者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 loopclosure)。如果它是一个数组,您将免费获得它,那么您可以使用[].map(function(){...}).forEach(function(){...}),这就是框架的foreach(object)等价物有用的原因;它们通常还会使用.hasOwnProperty过滤掉“原型垃圾” 。)

于 2012-04-13T02:18:04.997 回答
0

您提供的代码将被翻译为:

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

如果这不起作用,请在您的问题中解释原因。

于 2012-04-13T02:07:43.250 回答