从圆形数组中提取样本(indexA到indexB)

Taking samples (indexA to indexB) from a Circular array

本文关键字:indexA indexB 样本 提取 数组      更新时间:2023-09-26

我有一个数组

var a=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15];

我使用这个数组的方式是,它的开始就是结束,就像这样:

             0
        1        15
     2              14
    3                13
   4                  12
    5                11
     6              10
        7         9
             8

http://en.wikipedia.org/wiki/Circular_buffer

阵列长度也是一个更长的数字

我想从中提取样本,比如,从一个索引到另一个索引,每次都要提取n项。

所以如果你想得到的索引是2,而n是3,你就会得到

a[0],a[1],a[2] // 0,1,2

可以用切片来完成,或者最好用循环来收集它们。。

但是如果我想要的索引是1或0,那么如果n可以随时更改,我该如何获得最后的部分呢

有什么简单的方法可以做到这一点?


var a=[0,1,2,3,4,5,6,7,8,9,10];
var index=1;
var n=4;
var i=[n,0];
var b=[];
while(i[0]--){
    b.unshift(
        a[index-i[1]]!==undefined?a[index-i[1]]:a[a.length-Math.abs(index-i[1])]
        );
    i[1]+=1;
    }
console.log(b);  // [9, 10, 0, 1] 

我会用这种方式处理.slice()

var a = [0,1,2,3,4,5,6,7,8,9,10];
function getFromCircArr(arr, i, n) {
    var d = i + 1 - n;
    return d < 0 ?  arr.slice(d).concat(arr.slice(0, i + 1)) : arr.slice(d, i + 1);
};
getFromCircArr(a, 2, 3); // --> [0, 1, 2]
getFromCircArr(a, 1, 4); // --> [9, 10, 0, 1]