所以例如,如果我已经知道我在30位并且我知道我总共有30个元素,我需要一个函数返回带有prev的数组或对象。 2个元素(29,28)和接下来的3个元素(1,2,3),如下所示:
http://jsbin.com/ohazag/5/edit(但遗憾的是,它在某些情况下不起作用)。
有没有更好的方法来使用javascript甚至更好的jquery函数我可能不知道?我确定我在这里缺少一些很酷的技巧。
答案 0 :(得分:3)
所以基本上你有一个x元素数组,你想要元素[x-2,x + 3]! 我的实施将是直截了当的,我不确定这是否正是你所需要的,但如果你需要别的话,我会尝试调整它;)
var arr = [1,2,3,4,5,6,7];
var o_left = 2; //offset to the left
var x = 5; //current index
var o_right = 3; //offset to the right
var arrs = new Array(); //the new array
for (var i = x - o_left; i <= x + o_right; i++) {
if (i == x)
continue;
arrs.push(arr[(i + arr.length) % arr.length]);
}
此解决方案中的关键是%运算符,它返回整数除法的其余部分,例如: 10%3 = 1.这意味着如果索引变为高,则在数组的末尾,它从0开始。
答案 1 :(得分:1)
最简单的解决方案是将数组与自身连接三次,然后从更大的数组中切片。这会花费额外的内存,但对于数组而言呢? 1000个无关紧要的元素。
vslice = function(a, index, before, after) {
return [].concat(a, a, a).slice(
index + a.length - before,
index + a.length + after + 1
)
}
vslice([0,1,2,3,4,5,6,7,8,9], 1, 2, 3) // [9,0,1,2,3,4]
vslice([0,1,2,3,4,5,6,7,8,9], 9, 2, 3) // [7,8,9,0,1,2]
vslice([0,1,2,3,4,5,6,7,8,9], 5, 2, 3) // [3,4,5,6,7,8]
为那些没有得到它的人举例说明:
slice [0,1,2,3], index 1, 2 before, 3 after ----------- | 0 1 2 3 | ----------- ^ 1. repeat the array three times --------------------------- | 0 1 2 3 0 1 2 3 0 1 2 3 | --------------------------- 2. add array.length (=4) to the index --------------------------- | 0 1 2 3 0 1 2 3 0 1 2 3 | --------------------------- ^ ^ |_______^ 3. subtract "before" (=2) from and add "after" (=3) to the index --------------------------- | 0 1 2 3 0 1 2 3 0 1 2 3 | --------------------------- ^ ^ ^ -2 +3 4. slice between new indexes --------------- | 3 0 1 2 3 0 | ---------------
答案 2 :(得分:0)
根据dmm79的例子,可能是一种笨重的解决方案:
var maxPages = 38;
var currentPage = 37;
var pagesToCacheLeft = 2;
var pagesToCacheRight = 3;
var next, prev;
function getPagestoCache(current,max) {
var intArrayPrev = [];
var intArrayNext = [];
for(var i = 1; i < pagesToCacheLeft + 1; i++)
{
var prev = current - i;
if(prev < 1)
{
prev = max + prev;
}
console.log(prev);
intArrayPrev[i-1] = prev;
}
for(var j = 1; j < pagesToCacheRight + 1; j++)
{
var next = current + j;
if(next > max)
{
next = next % max;
}
console.log(next);
intArrayNext[j - 1] = next;
}
return (intArrayPrev.length && intArrayNext.length) ? intArrayNext.concat(intArrayPrev):false;
}
var arrPagestoCache = getPagestoCache(currentPage,maxPages);
for (var i=0;i<arrPagestoCache.length;i++){
console.log("Cache Page->"+arrPagestoCache[i]);
}