从指定的起始索引中获取许多元素

时间:2015-01-02 10:29:49

标签: javascript arrays underscore.js

我们说我有一个这样的简单数组: 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(),如果我们点击最后一个索引,则应返回数组开头的元素(以便始终遵循返回的元素总数)。可以使用纯javascript或像下划线/ lodash这样的库。

示例:

myArr.getElementsFromIndex(3, 5) 

应该返回[3,4,5,6,7]

myArr.getElementsFromIndex(8, 5) 

应该返回[8,9,0,1,2]

4 个答案:

答案 0 :(得分:3)

使用以下代码

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

答案 1 :(得分:1)

Array#slice采用开始和结束索引(不是起始索引和多个元素)。

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

您可以使用切片编写包装函数(不会修改原始数组):

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

此函数返回您需要的内容(see example),如果需要,甚至可以多次回绕。

如果你想将函数绑定到数组,为了按照你的建议使用它(即myArr.getElementsFromIndex(start, numElements)),你可以将它添加到Array的原型中。但是,您可能希望查找/反对修改内置类型原型的参数。

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.

答案 2 :(得分:1)

将此添加到您的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 DEMO:http://jsfiddle.net/x6oy0krL/1

也许有些人会说扩展像Array,documentElement这样的对象是不对的,但结果就像OP想要的那样。

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

答案 3 :(得分:1)

只需将数组连接到自身,然后使用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;
}