![](/img/trans.png)
[英]How to rotate an image clockwise or counterclockwise, whichever is shorter?
[英]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.