簡體   English   中英

對於來回循環

[英]For loop that goes back and forth

對於向前和向后計數的循環來說是微不足道的,但是如果我希望它向前然后向后計數,則可以執行2次循環。

然后我有了這個想法,可以在一個for循環中完成它,它可以工作,但是我不喜歡它的外觀,有人可以用一種更優雅的方式嗎

var array = ['A','B','C','D','E','F'];

for(var x=0,i=0; i<(array.length*2)-1; ++i, x = (i>=array.length)?(array.length-2-(i%array.length)):i){
    printf(array[x]);
}

x最小。最大。最小

http://jsfiddle.net/Victornpb/48sJg/2/

只是將其扔在那里,如果后退再前進(max-min-max)對您有用,則可以執行以下操作:

var array = ['A','B','C','D','E','F'];
for (var c=-(array.length),l=array.length;c<l;c++) {
  console.log(array[Math.abs(c)]);   
}

輸出:

F
E
D
C
B
A
B
C
D
E
F 

您不是在做自己,也不是在閱讀此代碼的任何其他人有助於使事情變得過於復雜。 代碼應可讀可維護。 我推薦的方法(該模型模擬與Array.prototype.forEach相似的行為,但不修改原型)是

Array.cycleThrough = function (arr, func, scope) {
    'use strict';
    var i;

    for(i = 0; i < arr.length; i++) {
        if(i in arr) {
            func.call(scope, arr[i], i, arr);
        }
    }

    for(i = arr.length - 2; i >= 0; i--) {
        if(i in arr) {
            func.call(scope, arr[i], i, arr);
        }
    }
};

var foo = ['A', 'B', 'C', 'D'];
Array.cycleThrough(foo, function (current, index, array) {
    console.log(current);
});

盡管名稱cycleThrough當然也可以改進。 該結構取自MDN:Array.prototype.forEach ,以盡可能與ECMAScript保持一致。

如您所見,將使用迭代的當前元素,其所在的索引以及整個數組本身來調用回調函數。 您還可以傳遞自定義作用域,應在其上調用回調。

一個簡單的解決方案是鏡像和連接數組。

var array = ['A','B','C','D','E','F'];
var reversed = array.slice().reverse(); //["F", "E", "D", "C", "B", "A"]
var mirrored = array.concat(reversed); //["A", "B", "C", "D", "E", "F", "F", "E", "D", "C", "B", "A"]

然后只需執行一個常規循環即可進行迭代。

您可以使用變量來跟蹤循環的方向:

var array = ['A','B','C','D','E','F'];

for (var i = 0, dir = 1; i > -1; i += dir, dir *= i == array.length - 1 ? -1 : 1) {
  console.log(i, array[i]);
}

演示: http//jsfiddle.net/Guffa/Mv36H/

也許添加一個“方向”變量。 當您到達數組的末尾時,請反轉方向...並針對條件,只需確保您不在數組的開頭之前(除非之前的迭代是返回行程的一部分,否則您不會在數組的開頭)並剛剛處理了元素0)。

for (var i = 0, di = 1; i >= 0; i += di) {
    if (i == array.length) { di = -1; continue; }

    /* do your thing with array[i] */
}

這將訪問最后一個元素兩次。 如果您只想訪問一次,請聲明

    if (i == array.length - 1) { di = -1; }

演示

暫無
暫無

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

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