从指定起始索引处获取多个元素

Get a number of elements from a specified starting index

假设我有一个像这样的简单数组: var myArr = [0,1,2,3,4,5,6,7,8,9]

我想extract a number of elements, starting from a specific index,像这样:

myArr.getElementsFromIndex(index, numberOfElements)

其中,unlike .slice(),如果我们命中最后一个索引,则应从数组开头对元素进行 returned(以便元素总数 returned将永远受到尊重)。可以使用纯 javascript 或像 underscore/lodash 这样的库。

示例:

myArr.getElementsFromIndex(3, 5) 

应该return[3,4,5,6,7]

myArr.getElementsFromIndex(8, 5) 

应该return[8,9,0,1,2]

使用下面的代码

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

function getElementsFromIndex(startIndex, num) {

    var elems = [];
    for(var iter = 0; iter<num; iter++) {
        if(startIndex >= myArr.length) {
            while(startIndex >= myArr.length) {
               startIndex -=  myArr.length;
            }
        } 
        elems.push(myArr[startIndex]);
        startIndex++;
    }
    return(elems);
}

Array#slice 采用开始和结束索引(不是开始索引和一些元素)。

Array#splice 做你想做的,除了环绕(但也修改了原始数组)。

可以用slice写一个wrapper函数(不会修改原数组):

function getElementsFromIndex(arr, start, numElements) {
    if(start + numElements > arr.length) {
        var endOfArr = arr.slice(start, arr.length);
        var elementsFound = arr.length - start;
        var restElements = getElementsFromIndex(arr, 0, numElements - elementsFound);
        return endOfArr.concat(restElements);
    }
    return arr.slice(start, start + numElements);
}

此函数 returns 您需要的功能 (see example),如果需要,甚至可以循环多次。

如果您想将函数绑定到数组,以便按照您的建议使用它(即 myArr.getElementsFromIndex(start, numElements)),您可以将它添加到 Array 的原型中。不过,您可能想要查找参数 for/against 修改内置类型的原型。

Array.prototype.getElementsFromIndex = function(start, numElements) {
    if(start + numElements > this.length) {
        var endOfArr = this.slice(start, this.length);
        var elementsFound = this.length - start;
        return endOfArr.concat(this.getElementsFromIndex(0, numElements - elementsFound));
    }
    return this.slice(start, start + numElements);
};

See example of the last one here.

将此添加到您的 js 代码中:

Array.prototype.getElementsFromIndex = function (start, len) {
    var newArray = [],
        origArray = this,
        i = start;

    while (newArray.length < len) {
        newArray.push(origArray[i++]);

        if (i >= origArray.length)
            i = 0;
    }
    return newArray;
}

你可以完全按照你想要的方式使用它:

var myArr = [0,1,2,3,4,5,6,7,8,9];
alert(myArr.getElementsFromIndex(8, 5));

JSFIDDLE 演示:http://jsfiddle.net/x6oy0krL/1

也许有人会说扩展Array、documentElement等对象是不对的,但这里的结果是OP想要的。

我想说原数组也不会被修改

只需将数组连接到自身,然后使用 slice:

 function sliceWrap(arr, start, num) {
     return arr.concat(arr).slice(start, start+num); 
}

另一种方法,环绕:

function sliceWrap2(arr, start, num) {
    var result = [], i, end = start+num, len = arr.length;
    for (i=start; i<end; i++) {
        result.push(arr[i % len]);
    }
    return result;
}