Rotação de um índice de número / array

Este é um conceito super simples, mas muitas vezes esquecido. Exemplo de conjunto de problemas: você tem um jogo com dois ou mais jogadores e currentPlayermantém o estado como um int. Normalmente, quando é hora de ir para o próximo jogador currentPlayer + 1, você faria até chegar ao último jogador e obter um índice de erro fora dos limites ( currentPlayer => 3quando há apenas dois jogadores). Normalmente, uma condição para verificar fora dos limites é fazer:

currentPlayer++;
if (currentPlayer >= numerOfPlayers) {
currentPlayer
= 0;
}

No entanto, existe uma maneira mais fácil com o módulo. Uma vez que a matemática é nossa amiga, um módulo converterá seu fora dos limites em uma função rotativa. Este é frequentemente o caso para determinar valores pares ímpares com um contador de incremento:

var i, isEven, results = [];
for (i = 0; i < 20; i++) {
isEven
= (i % 2) === 0;
results
.push(isEven);
}

Se você reatribuir o contador ao resultado, ele está reiniciando o contador. Isso é equivalente ao primeiro exemplo:

currentPlayer = (currentPlayer + 1) % numberOfPlayers;
// Or for golf competitions:
c
= ++c % n;

Usando essa técnica e o propósito de ter um int para um índice de matriz, o seguinte código:

function playTurn(domElTile) {
if (currentPlayer === 0) {
domElTile
.className = 'white';
currentPlayer
= 1;
} else {
domElTile
.className = 'black';
currentPlayer
= 0;
}
}

Pode ser simplificado para:

function playTurn(domElTile) {
domElTile
.className = ['white', 'black'][currentPlayer];
currentPlayer
= (currentPlayer + 1) % 2;
}