2013-07-25 33 views
6

phép nói rằng tôi có:Extract x mục từ mảng (slice) nhưng vẫn tiếp tục ngay từ đầu nếu cuối cùng là đạt

var array = [0,1,2,3,4,5,6,7,8,9] 

tôi xác định:

var itemsToExtract = 5 
var startindex = 7 
var direction = "forward" 

Tôi muốn để có thể làm:

array.someMethod(startindex, itemsToExtract, direction) 

và nhận

[7,8,9,0,1] 

Tôi cũng muốn nó hoạt động ngược, nếu tôi đặt hướng thành "lùi" (cắt từ phải sang trái).

Tôi wasnt quá lười biếng và cố gắng một cái gì đó đã, xem tại đây: http://jsfiddle.net/MkNrr/

Tôi đang tìm kiếm một cái gì đó "ngăn nắp" nếu có, cũng là có một tên cho phương pháp này, nó là một vấn đề được biết đến?

Thông tin cơ bản: Tôi đang cố tạo một trình tải ảnh trước tuần tự (tải một hình ảnh (src) sau ảnh kia) để sử dụng trong thư viện hình ảnh. Có lẽ ngay cả một thư viện như vậy đã tồn tại?

Trả lời

0

của nó không nhiều, nhưng có vẻ tốt đẹp 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')); 
0

Chỉ cần tạo bản sao của mảng và thêm các mảng ban đầu cho đến khi nó đủ lâu:

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); 
1

Làm thế nào về một hàm trả về mảng phía trước và sau? Bằng cách đó bạn không cần một công tắc. Một cái gì đó như thế này:

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 }; 
} 

Sau đó, bạn có thể sử dụng nó như:

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] 
+0

trong jsfiddle 'show backward' mình gây' 7, 6, 5, 4, 3' – rab

+0

Nó chỉ là một ngược lại đơn giản trong trường hợp đó 'trở lại: back.reverse() ' – elclanrs

1

cách tiếp cận của tôi:

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

CẬP NHẬT

Một phiên bản sử dụng biến count ra lệnh hướng sử dụng/giá trị âm dương và với một sửa chữa cho phép sử dụng count lớn hơn độ dài mảng:

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

0

Để lọc vị trí không hợp lệ, tôi thêm một số xác thực, mà không có mã nào thậm chí có thể ngắn hơn.

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) 

với mã trên, bạn có thể:
bắt đầu từ một vị trí trừ, mà sẽ được tính lại từ đầu kia.
Số có thể dài hơn độ dài mảng, số này sẽ trả về số của bạn nhiều lần.

0

Xin chào mã này.

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'); 
Các vấn đề liên quan