1

因此,例如,如果我已经知道我在位置 30 并且我知道我总共有 30 个元素,我需要一个函数来返回一个带有 prev 的数组或对象。2 个元素 (29,28) 和接下来的 3 个元素 (1,2,3),如下所示:

http://jsbin.com/ohazag/5/edit(但遗憾的是它不适用于某些条件)。

有没有更好的方法可以用 javascript 甚至更好的我可能不知道的 jquery 函数来做到这一点?我确定我在这里缺少一些很酷的技术。

4

3 回答 3

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 开始。

于 2013-06-02T12:12:10.330 回答
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]

给不明白的人的插图:

切片 [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 |
---------------

于 2013-06-02T12:25:00.117 回答
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]);
}
于 2013-06-02T12:45:05.973 回答