簡體   English   中英

如何在順時針和逆時針從某個位置循環數組?

[英]How can I loop an array from certain position in clockwise and counterclockwise?

我有這個數組:

var array = [0,1,2,3,4,5,6,7,8,9,10];

以順時針方向循環(開始8,然后9,然后10,然后0 .....),我這樣做是:

var start = 8;
for(i = 0; i < array.length; i++){
    index = (start+i)%array.length;
    ....
}

1)順時針方向,有更好的方法嗎?

2)要沿逆時針方向循環(開始2,然后是1,然后是0,然后是10 ...),該怎么辦?

要執行與您類似的操作,請從起始索引開始減少索引,並在修剪之前添加長度:

var start = 8;
for(i = 0; i < array.length; i++) {
  index = (start - i + array.length) % array.length;
  // ....
}

關於“如何做得更好”,我將創建一個簡單的輔助函數:

function getIndexInRange(index, length) {
  var trim = index % length;
  var nonNegative = trim + length;
  return nonNegative % length;
}

然后,一切變得更加清晰:

var start = 8;
for(i = 0; i < array.length; i++) {
  var index = getIndexInRange(start + i, array.length);
  // ....
}

for(i = 0; i < array.length; i++) {
  var index = getIndexInRange(start - i, array.length);
  // ....
}

現在,您甚至可以根據需要對數組進行多次迭代,並且仍然可以使用:

for(i = 0; i < array.length * 5; i++) {
  var index = getIndexInRange(start - i, array.length);
  // ....
}

我在這里創建了一個jsbin。

http://jsbin.com/tucusal/edit?html,js,控制台

您甚至可以創建一個接受方向輸入然后沿該方向遍歷數組的函數。

var array = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var start = 8;
clockwise = 1;
anti_clockwise = -1;

direction = clockwise;
traverse(array, start, anti_clockwise);

function traverse(array, start,  direction) {
  var count = array.length;
  for (i = start; count > 0; i += direction) {
    var index = array[(array.length + i) % array.length];
    count--;
    console.log(index);
  }
}

 var array = [0,1,2,3,4,5,6,7,8,9,10]; function clockwise(start){ for (var i = 0; i < array.length; i++){ console.log((start+i)%array.length); } } function counterClockwise(start){ for (var i = array.length; i > 0; i--){ console.log((start+i)%array.length); } } console.log('clockwise start from '); clockwise(8); console.log('clockwise End '); console.log('counterClockwise start from '); counterClockwise(2); console.log('counterClockwise End '); 

考慮在兩個方向上使用單個函數:

var array = [0,1,2,3,4,5,6,7,8,9,10];

function iterateByClockRotation(start, array, direction){
    var len = array.length, current = start;
    while (len--) {
        current = array.indexOf(current);
        if (current < 0) current = ((direction === "clockwise")? 0 : array.length-1);
        console.log(array[current]); // the current value
        (direction === "clockwise")? current++ : current--;
    }
}

iterateByClockRotation(8, array, "clockwise");

“順時針”方向的輸出:

8
9
10
0
1
2
3
4
5
6
7

iterateByClockRotation(2, array, "anticlockwise");

“逆時針”方向的輸出:

2
1
0
10
9
8
7
6
5
4
3

您可以使用Array.prototype.slice更改數組的開始:

 Array.prototype.enhancedForEach = function(callback, start = 0, clockwise = true) { var array = this; start %= array.length; array.slice(start) .concat(array.slice(0, start)) .forEach((v, i, arr) => { var index = clockwise ? i : arr.length - i - 1; callback(arr[index], index, arr); }); } array = Array.from({ length: 20 }, (v, i) => i); array.enhancedForEach(v => console.log(v), 4); array.enhancedForEach(v => console.log(v), 0, false); 
 http://stackoverflow.com/posts/37981887/edit# 

暫無
暫無

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

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