让我说我有:
var array = [0,1,2,3,4,5,6,7,8,9]
我定义:
var itemsToExtract = 5
var startindex = 7
var direction = "forward"
我希望能够做到:
array.someMethod(startindex, itemsToExtract, direction)
并获取
[7,8,9,0,1]
如果我将方向设置为“向后”(从右到左切片),我也希望它向后工作。
我太懒了,已经尝试了一些东西,请看这里:http://jsfiddle.net/MkNrr/
我正在寻找“更整洁”的东西,如果有的话,这个方法也有名称,这是一个已知的问题吗?
背景:我正在尝试构建一个顺序预映像加载器(在另一个之后加载一个图像(src))以在图库中使用。也许甚至这样的图书馆已经存在?
答案 0 :(得分:1)
返回前向和后向数组的函数怎么样?这样你就不需要开关了。像这样:
function overslice(arr, idx, items) {
var fwd = arr.filter(function(v,i){ return i >= idx }).slice(0, items),
back = arr.filter(function(v,i){ return i <= idx }).slice(-items);
while (fwd.length < items) {
fwd = fwd.concat(arr).slice(0, items);
}
while (back.length < items) {
back = arr.concat(back).slice(-items);
}
return { fwd: fwd, back: back };
}
然后你就可以使用它:
var array = [0,1,2,3,4,5,6,7,8,9]
var result = overslice(array, 7, 5);
console.log(result.fwd, result.back); //=> [7, 8, 9, 0, 1] [3, 4, 5, 6, 7]
答案 1 :(得分:1)
我的方法:
function overslice(array, startindex, count, direction) {
var retarray = [];
var increment = (direction === 'backward') ? -1 : 1;
for(var c=0, i = startindex; c<count; i+=increment, c++){
retarray.push(array[(i + array.length)%array.length]);
}
return retarray;
}
<强> Working fiddle 强>
<强>更新强>
另一个版本使用count
变量来指示使用正/负值的方向,并使用修正来允许使用大于数组长度的count
:
function overslice(array, startindex, count) {
var retarray = [];
var increment = (count >= 0) ? 1 : -1;
count = Math.abs(count);
for(var i = startindex, c = 0;c<count;i+=increment, c++){
if(i<0) i= array.length-1;
retarray.push(array[i%array.length]);
}
return retarray;
}
<强> Demo fiddle 强>
答案 2 :(得分:0)
它不多,但看起来很好JS Bin:
function overSlice(arr, start, count, dir){
if(dir==='backward'){
arr = arr.reverse();
start = arr.length-start-1;
}
var lastIndex = start+count;
return arr.slice(start, lastIndex>arr.length?arr.length: lastIndex)
.concat(arr.slice(0, lastIndex>arr.length?lastIndex-arr.length: 0));
}
var arr = [0,1,2,3,4,5,6,7,8,9];
alert(overSlice(arr,7,5,'backward'));
答案 3 :(得分:0)
只需创建数组的副本并附加原始数组,直到它足够长:
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var start = 7
var count = 5
var tmparr = arr
while (tmparr.length < start + count) {
tmparr = tmparr.concat(arr);
}
var result = tmparr.slice(start, start + count);
alert(result);
答案 4 :(得分:0)
为了过滤无效位置,我添加了一些验证,没有这些验证,代码可以更短。
var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
var countToExtract = 10
var whereToBegin = -1
var direction = "backword"
function overslice(array, startIndex, count, direction) {
var retArray = [];
var step = direction == "backword" ? -1 : 1;
var startPos = (startIndex + array.length) % array.length;
var endPos = (startPos + (count % array.length) * step + array.length) % array.length;
for (var i = 0; i < count; i++) {
var pos = (startPos + (i * step) % array.length + array.length) % array.length;
retArray.push(array[pos]);
}
return retArray;
}
var lampa = overslice(arr, whereToBegin, countToExtract, direction)
alert(lampa)
使用上面的代码,您可以:
从负位置开始,从另一端开始计数
count可以比数组长度长,这将重复返回数字。
答案 5 :(得分:0)
您好试试这段代码。
function myslice( ar , start , count , dir ) {
dir = dir || 'F';
var out = [] ,
times = Math.ceil( ( start + count )/ ar.length ) + 1;
while( times-- ) {
[].push.apply( out, ar );
}
if ( dir == 'B' ) {
start = ar.length - start - 1;
out = out.reverse() ;
}
return out.slice( start , start+count );
}
myslice ( [0,1,2,3,4,5,6,7,8,9] , 7 , 5 , 'B' );