Javascript 如何从某个位置顺时针和逆时针循环数组?

Javascript 如何从某个位置顺时针和逆时针循环数组?,javascript,arrays,loops,iteration,Javascript,Arrays,Loops,Iteration,我有这个阵列: 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; .... } var start=8; 对于(i=0;iconsole.log(v),4); enhancedForEach(v=>console

我有这个阵列:

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;
    ....
}
var start=8;
对于(i=0;i
1)顺时针方向,有更好的方法吗?


2)若要逆时针循环(开始2,然后1,然后0,然后10…),我应该怎么做?若要执行类似于您所做的操作,请从起始索引开始减少索引,并在修剪前添加长度:

var start = 8;
for(i = 0; i < array.length; i++) {
  index = (start - i + array.length) % array.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);
  // ....
}
var start=8;
对于(i=0;i
现在,如果需要,您甚至可以多次迭代该数组,它仍然可以工作:

for(i = 0; i < array.length * 5; i++) {
  var index = getIndexInRange(start - i, array.length);
  // ....
}
for(i=0;i
要执行类似于您所做的操作,请从起始索引开始减少索引,并在修剪前添加长度:

var start = 8;
for(i = 0; i < array.length; i++) {
  index = (start - i + array.length) % array.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);
  // ....
}
var start=8;
对于(i=0;i
现在,如果需要,您甚至可以多次迭代该数组,它仍然可以工作:

for(i = 0; i < array.length * 5; i++) {
  var index = getIndexInRange(start - i, array.length);
  // ....
}
for(i=0;i
我在这里创建了一个jsbin

您甚至可以创建一个函数,该函数接受方向输入,然后沿该方向遍历数组

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

我在这里创建了一个jsbin

您甚至可以创建一个函数,该函数接受方向输入,然后沿该方向遍历数组

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数组=[0,1,2,3,4,5,6,7,8,9,10];
功能顺时针(启动){
对于(var i=0;i0;i--){
console.log((start+i)%array.length);
}
}
console.log('顺时针开始');
顺时针方向(8);
console.log(“顺时针结束”);
log('逆时针开始');
逆时针方向(2);
console.log(“逆时针方向结束”)
var数组=[0,1,2,3,4,5,6,7,8,9,10];
功能顺时针(启动){
对于(var i=0;i0;i--){
console.log((start+i)%array.length);
}
}
console.log('顺时针开始');
顺时针方向(8);
console.log(“顺时针结束”);
log('逆时针开始');
逆时针方向(2);

console.log(“逆时针方向结束”)考虑在两个方向上使用单个函数:

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
2
1
0
10
9
8
7
6
5
4
3

考虑对两个方向使用一个函数:

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
2
1
0
10
9
8
7
6
5
4
3

您可以使用
Array.prototype.slice
更改数组的开头:

Array.prototype.enhancedForEach=函数(回调,开始=0,顺时针=true){
var数组=这个;
start%=数组长度;
array.slice(开始)
.concat(数组.slice(0,开始))
.forEach((v,i,arr)=>{
var指数=顺时针?i:arr.length-i-1;
回调(arr[index],index,arr);
});
}
array=array.from({
长度:20
},(v,i)=>i);
enhancedForEach(v=>console.log(v),4);
enhancedForEach(v=>console.log(v),0,false)

http://stackoverflow.com/posts/37981887/edit#
您可以使用
Array.prototype.slice
更改数组的开始:

Array.prototype.enhancedForEach=函数(回调,开始=0,顺时针=true){
var数组=这个;
start%=数组长度;
array.slice(开始)
.concat(数组.slice(0,开始))
.forEach((v,i,arr)=>{
var指数=顺时针?i:arr.length-i-1;
回调(arr[index],index,arr);
});
}
array=array.from({
长度:20
},(v,i)=>i);
enhancedForEach(v=>console.log(v),4);
enhancedForEach(v=>console.log(v),0,false)

http://stackoverflow.com/posts/37981887/edit#
谢谢,非常干净。谢谢,非常干净。谢谢,非常干净。非常干净。谢谢,非常干净。谢谢,非常干净。