从指定起始索引处获取多个元素
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);
};
将此添加到您的 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;
}