因此,例如,如果我已经知道我在位置 30 并且我知道我总共有 30 个元素,我需要一个函数来返回一个带有 prev 的数组或对象。2 个元素 (29,28) 和接下来的 3 个元素 (1,2,3),如下所示:
http://jsbin.com/ohazag/5/edit(但遗憾的是它不适用于某些条件)。
有没有更好的方法可以用 javascript 甚至更好的我可能不知道的 jquery 函数来做到这一点?我确定我在这里缺少一些很酷的技术。
因此,例如,如果我已经知道我在位置 30 并且我知道我总共有 30 个元素,我需要一个函数来返回一个带有 prev 的数组或对象。2 个元素 (29,28) 和接下来的 3 个元素 (1,2,3),如下所示:
http://jsbin.com/ohazag/5/edit(但遗憾的是它不适用于某些条件)。
有没有更好的方法可以用 javascript 甚至更好的我可能不知道的 jquery 函数来做到这一点?我确定我在这里缺少一些很酷的技术。
所以基本上你有一个 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 开始。
最简单的解决方案是将数组与自身连接三次,然后从更大的数组中分割出您需要的内容。这会消耗额外的内存,但对于 < 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]
给不明白的人的插图:
切片 [0,1,2,3],索引 1, 2 之前,3 之后 ------------ | 0 1 2 3 | ------------ ^ 1.重复数组3次 -------------------------- | 0 1 2 3 0 1 2 3 0 1 2 3 | -------------------------- 2. 将array.length (=4) 添加到索引中 -------------------------- | 0 1 2 3 0 1 2 3 0 1 2 3 | -------------------------- ^ ^ |_______^ 3.从索引中减去“之前”(=2)并将“之后”(=3)添加到索引中 -------------------------- | 0 1 2 3 0 1 2 3 0 1 2 3 | -------------------------- ^ ^ ^ -2 +3 4. 新索引之间的切片 --------------- | 3 0 1 2 3 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]);
}