我们说我有一个这样的简单数组:
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]
答案 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);
};
答案 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;
}