绕过数组的有效方法?

时间:2013-03-10 10:37:23

标签: javascript

我想知道是否有更有效的方法可以绕过数组。就我的目的而言,数组正在保存图像源。当显示最后一个图像并按下下一个按钮时,它会循环回到第一个图像。如果在第一张图像上按下上一个按钮,则它会转到最后一张图像。

这是我能够提出的,但我觉得有一种更有效的方法。

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

3 个答案:

答案 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。但是,如果不知道你的其余代码,我不知道这种方法是否适合你。