问题
There is a very common and easy task of looped iteration through some range in both directions:
var currentIndex = 0;
var range = ['a', 'b', 'c', 'd', 'e', 'f'];
function getNextItem(direction) {
currentIndex += direction;
if (currentIndex >= range.length) { currentIndex = 0; }
if (currentIndex < 0) { currentIndex = range.length-1; }
return range[currentIndex];
}
// get next "right" item
console.log(getNextItem(1));
// get next "left" item
console.log(getNextItem(-1));
The code above works perfectly, but I spent about an hour trying to get rid of double if
check.
Is there any way to solve if without if? Sort of one-liner maybe?
回答1:
To turn the two if
s into one unconditional statement, you can add the range.length
to the currentIndex
and then use modulo:
var currentIndex = 0;
var range = ['a','b','c','d','e','f'];
function getNextItem(direction) {
currentIndex = (currentIndex + direction + range.length) % range.length;
return range[currentIndex];
}
// get next "right" item
console.log(getNextItem(1));
console.log(getNextItem(1));
// get next "left" item
console.log(getNextItem(-1));
console.log(getNextItem(-1));
console.log(getNextItem(-1));
console.log(getNextItem(4));
console.log(getNextItem(1));
console.log(getNextItem(1));
console.log(getNextItem(1));
来源:https://stackoverflow.com/questions/58142680/iterating-through-a-range-in-both-directions