簡體   English   中英

如何反轉 FOR 循環中的順序

[英]How to reverse the order in a FOR loop

我有一個簡單的 FOR 語句,如下所示:

var num = 10,
    reverse = false;

for(i=0;i<num;i++){
    console.log(i);
}

reverse為 false 我希望它返回類似 [0,1,2,3,4,5,6,7,8,9]

但是,當reverse為真時,它應該返回 [9,8,7,6,5,4,3,2,1,0]

哪個是獲得此結果的最有效方法,無需每次都檢查循環內的reverse是真還是假?

我不想這樣做:

var num = 10,
    reverse = false;

for(i=0;i<num;i++){
    if(reverse) console.log(num-i)
    else console.log(i)
}

我只想在循環外檢查一次反向

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 ); }

編輯:

正如下面的評論中所指出的,如果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 ); }

嘗試使用 2 個循環:

if (reverse) {
    for(i=num-1;i>=0;i--){
        console.log(i)
    }
}
else {
    for(i=0;i<num;i++){
        console.log(i)
    }
}
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);
}

這等效於以下內容,它更具可讀性,但不那么緊湊:

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);
}

編輯:
實際上,這兩個解決方案並不相同,因為第一個解決方案有一個額外的增量操作。 盡管如此,從性能的角度來看,它可以忽略不計。 如果您真的想獲得具有最佳性能的緊湊解決方案,您可以執行以下操作(不適合膽小的人):

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);
}

這具有單個控制結構、每個循環中的單個測試和單個迭代器添加的優點。 它沒有迭代器遞增/遞減那么快,但只是略微如此。

var start; var end; var inc;
if (reverse) {
    start = num-1; end = 0; inc = -1;
}
else {
    start = 0; end = num-1; inc = 1;
}
for(i=start;i!=end;i+=inc){
    console.log(i)
}

前幾天我剛遇到這個需求。 這是我如何做到的:

var num = 10,
    i = 0,
    direction = 1, 
    reverse = false;

if(reverse)
    i = num + (direction = num = -1);

for(; i !== num; i += direction) {
    console.log(i);
}

不需要單獨的循環,也不需要做數學運算來計算循環中的正確i

所以如果reversetrue ......

  • i (代表我們的第一個項目)變成num - 1 ,所以我們現在從最后一個項目開始

  • num (代表越界)變為-1 ,所以我們現在停止在第一個項目上

  • direction-1 ,這意味着當我們做i += direction時它會遞減

因此,通過將起點與終點交換並將i的變化從1更改為-1 ,我們將根據這些修改上升或下降。

我認為這符合您的要求:

var num = 10;
var reverse = false;
var diff = 0;

if (reverse) {
    diff = num - 1;
}

for (i = 0; i < num; i++) {
    console.log(Math.abs(diff - i));
}

這是我一直以來做反向循環的方式:

for (i = num; --i >= 0; ) ...

你有什么問題:

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

}

羅伊的和我的很相似,但這是我的想法。 我會給你我用 C# 寫的東西,以及我認為它是如何轉換成 Javascript 的。

C#

    int num = 10;
    bool reverse = true;

    for (int i = reverse ? num : 0; (reverse ? 0 : i) < (reverse ? i : num); i += reverse ? -1 : 1)
    {
        Console.Write((reverse ? i - 1 : i).ToString());
    }
    Console.ReadKey();

Javascript

        var num = 10,
        reverse = true;

    for (int i = reverse ? num : 0; (reverse ? 0 : i) < (reverse ? i : num); i += reverse ? -1 : 1)
    {
        console.log(reverse ? i - 1 : i);
    }

這是另一種方式
Javascript

    var num = 10,
        reverse = false;

    for (int i = 0; i < num; i++)
    {
      console.log((reverse ? abs(-num + (i + 1)) : i));

    }

它似乎有效:

  var num = 10;
  var z = 1;
  var k = -10;
  if (reverse ){
    k = -1;
    z = -1;
  }
  for(int i = 0; i < 10; i++){
    console.log(num+i*z+k);
  }

當然,在像 Javascript 這樣的語言中,必須有一種方法來定義本地函數並在循環中使用它嗎?

function SubtractFrom(val, subtractor) {
    return val - subtractor;
}

function PassThrough(val) {
    return val;
}

var num = 10;
var processor = reverse ? SubtractFrom(num-1) : PassThrough;

for (i = 0; i < num; i++) {
    console.log(processor(i));
}

雖然不知道 Javascript,但我不知道函數定義會采用什么實際形式。

//reverse a number
let c = [2,3,5,67,4]
let sum = '';
let d = c.toString().split('')
console.log(d)
for(let i = d.length-1; i >= 0; i--) {
    sum += d[i]
}
console.log(sum)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM