我想知道是否有更有效的方法可以绕过数组。就我的目的而言,数组正在保存图像源。当显示最后一个图像并按下下一个按钮时,它会循环回到第一个图像。如果在第一张图像上按下上一个按钮,则它会转到最后一张图像。
这是我能够提出的,但我觉得有一种更有效的方法。
var marker = 0;
// Circle through an array.
function moveMarker(array, action, direction) {
if (!direction) {
if(marker == array.length - 1)
marker = -1;
marker += 1;
action();
}
else {
if (marker == 0)
marker = array.length;
marker -=1;
action();
}
}
答案 0 :(得分:10)
是的,您可以使用%
模运算符:
var marker = 0;
// Circle through an array.
function moveMarker(array, action, direction) {
if (!direction) {
marker = (marker + 1) % array.length;
}
else {
marker = (marker + array.length - 1) % array.length;
}
action();
}
甚至:
var marker = 0;
// Circle through an array.
function moveMarker(array, action, direction) {
marker = (marker + array.length + (direction ? -1 : 1)) % array.length;
action();
}
答案 1 :(得分:1)
首先,您可以简化if / else using数学,并使用modulo删除边界检查。
var marker = 0;
// Circle through an array.
function moveMarker(array, action, direction) {
var increment = direction ? 1 : -1;
marker = Math.modulo(marker + increment, array.length);
action();
}
然而,我建议将标记合并到一个对象中,而不是使用全局变量:
function markerMover(array, action, direction) {
var marker = 0;
function next() {
var increment = direction ? 1 : -1;
marker = Math.modulo(marker + increment);
action();
}
}
var mover = new markerMover(someArray, someAction, someDirection);
mover.next()
// or even
var intervalHandle = setInterval(mover.next, 25);
答案 2 :(得分:0)
预先声明一个局部变量来处理数组的最后位置,然后使用ternary operator来确定应该使用marker
做什么。三元运算符基本上允许您在执行操作的同一行上执行条件。之后,您只需要拨打一次action()
。
function moveMarker(array, action, direction) {
var a = array.length - 1;
if (!direction) {
marker += (marker === a) ? -(a) : 1;
} else {
marker += (marker === 0) ? (a) : -1;
}
action();
};
额外提示:您可能还希望将这些函数(即moveMarker()
和action()
)作为方法放入单个对象中,这样您就不会声明和更改全局变量marker
。但是,如果不知道你的其余代码,我不知道这种方法是否适合你。