如何在FOR循环中反转顺序

Ras*_*spo 15 javascript performance for-loop

我有一个简单的FOR语句,如下所示:

var num = 10,
    reverse = false;

for(i=0;i<num;i++){
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

反向为假时,我希望它返回类似[0,1,2,3,5,5,7,8,9]的内容

但是,当反向为真时,它应该返回[9,8,7,6,5,4,3,2,1,0]

获取此结果的最有效方法是什么,如果在循环内反转为true或false ,则不检查每次?

我不想这样做:

var num = 10,
    reverse = false;

for(i=0;i<num;i++){
    if(reverse) console.log(num-i)
    else console.log(i)
}
Run Code Online (Sandbox Code Playgroud)

我想在循环外只检查一次反向.

use*_*716 19

var num = 10,
reverse = false;

if(!reverse) for( var i=0;i<num;i++) log(i);
else         while(num-- )      log(num);

   // to avoid duplication if the code gets long
function log( num ) { console.log( num ); }
Run Code Online (Sandbox Code Playgroud)

编辑:

正如在下面的评论中指出,如果i是其他地方没有声明,你不打算为它是全球性的,那么你声明的其他变量声明.

如果您不想修改其值num,请将其分配给i第一个.

var num = 10,
reverse = false,
i;

if(!reverse) for(var i=0;i<num;i++) log(i);   // Count up
else         {var i=num; while(i--) log(i);}  // Count down

function log( num ) { console.log( num ); }
Run Code Online (Sandbox Code Playgroud)


Iva*_*uev 7

尝试使用2个循环:

if (reverse) {
    for(i=num-1;i>=0;i--){
        console.log(i)
    }
}
else {
    for(i=0;i<num;i++){
        console.log(i)
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我即将张贴与此相同的东西.在我看来,这是最自然和最易读的解决方案,也是高效的,反向标志只测试一次而不是每次都通过循环. (2认同)

Roy*_*ron 6

var num = 10,
    reverse = false;

for (var i = 0, n = reverse?num-1:0, d = reverse?-1:1; i < num; i++, n+=d) {
    console.log(n);
}
Run Code Online (Sandbox Code Playgroud)

这相当于以下内容,它更易读,但不太紧凑:

var num = 10,
    reverse = false;

var start = reverse ? num-1 : 0,
    end   = reverse ? -1 : num,
    step  = reverse ? -1 : 1;
for (var i = start; i != end; i += step) {
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

编辑:
实际上,这两个解决方案并不相同,因为第一个解决方案有一个额外的增量操作.不过,从性能的角度来看,它可以忽略不计.如果您真的想要获得性能最佳的紧凑型解决方案,您可以执行以下操作(不适合胆小的人):

var num = 10,
    reverse = false;

for (var r=reverse, i=r?num-1:0, n=r?-1:num, d=r?-1:1; i!=n; i+=d) {
    console.log(i);
}
Run Code Online (Sandbox Code Playgroud)

这具有以下优点:具有单个控制结构,每个循环中的单个测试以及单个迭代器添加.它没有迭代器递增/递减那么快,但只是略微如此.