3

配列を一周するより効果的な方法があるかどうか疑問に思います。私の目的では、配列は画像ソースを保持しています。最後の画像が表示され、次のボタンを押すと、最初の画像に戻ります。最初の画像で前のボタンを押すと、最後の画像に円を描きます。

これは私が思いついたものですが、もっと効率的な方法があると感じています。

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

3 に答える 3

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();
}
于 2013-03-10T10:41:38.033 に答える
1

まず、数学を使用してif / elseを単純化し、モジュロを使用して境界チェックを削除できます。

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);
于 2013-03-10T10:49:12.677 に答える
0

配列の最後の位置を処理するためにローカル変数を事前に宣言してから、三項演算子を使用して、で何をすべきかを決定しmarkerます。三項演算子を使用すると、基本的に、操作を実行するのと同じ行で条件を実行できます。その後、の呼び出しは1回だけで済みます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。しかし、あなたのコードの残りの部分を知らなければ、このアプローチがあなたのために働くかどうかはわかりません。

于 2013-03-10T10:49:14.790 に答える