Eu precisava codificar uma apresentação de slides que repetisse itens infinitamente ao deslizar para a esquerda e para a direita. A apresentação de slides sempre mostraria n slides ao mesmo tempo. Para mim, isso soou muito como um algoritmo de janela deslizante , apenas com um recurso adicional de repetição infinita.
Como eu precisava ter isso no Angular.js, criei uma função Javascript simples para obter esse algoritmo de “janela deslizante infinita”, como eu o chamo.
/**
* Returns a sliding window over data
* with lenth len, starting from cur
* repeating data infinitely to fit the window
*/
function infiniteSlidingWindow(data, cur, len) {
var win = [],
num = data.length,
numVisible = len;
// A negative cur is the same as num - abs(cur)
if (cur < 0) {
cur = num + cur;
}
// Now keep adding items until we have enough
while (win.length < numVisible) {
var first = (win.length?0:Math.abs(cur)%num),
missing = numVisible - win.length,
last = Math.min(first + missing, num);
win = win.concat(data.slice(first, last));
}
return win;
}
Na verdade, usei uma pequena modificação porque você não quer ter duplicatas ao usar ng-repeat
.
/**
* Use this slight modification if you need to avoid duplicate items.
* This keeps the window fixed when there are not enough items to fill it.
*/
function infiniteSlidingWindowNoRepeats(data, cur, len) {
if (data.length < len) {
len = data.length;
cur = 0;
}
return infiniteSlidingWindow(data, cur, len);
}
Aqui estão alguns testes para lançar em seu console ou interpretador Node.js, mostrando o comportamento esperado.
/* Tests */
var data = [0,1,2,3,4,5,6,7,8,9];
var result;
result = infiniteSlidingWindow(data, 0, 3);
console.log([0,1,2].join() == result.join());
result = infiniteSlidingWindow(data, 1, 3);
console.log([1,2,3].join() == result.join());
result = infiniteSlidingWindow(data, -1, 3);
console.log([9,0,1].join() == result.join());
result = infiniteSlidingWindow(data, -11, 5);
console.log([1,2,3,4,5].join() == result.join());
result = infiniteSlidingWindow(data, 2, 10);
console.log([2,3,4,5,6,7,8,9,0,1].join() == result.join());
data = [0,1,2,3];
result = infiniteSlidingWindow(data, 0, 5);
console.log([0,1,2,3,0].join() == result.join());
result = infiniteSlidingWindow(data, 2, 5);
console.log([2,3,0,1,2].join() == result.join());
result = infiniteSlidingWindowNoRepeats(data, 2, 5);
console.log(data.join() == result.join());
Divirta-se com isso!