Janelas deslizantes infinitas em Javascript

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!