如何获得具有当前索引和最大项目的n-2和n + 3个元素?

时间:2013-06-02 11:49:28

标签: javascript jquery

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

http://jsbin.com/ohazag/5/edit(但遗憾的是,它在某些情况下不起作用)。

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

3 个答案:

答案 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]);
}