在这篇帖子How to move to prev/next element of an array中,它告诉你如何移动prev / next数组元素。
但我想要Prev / Next Array Element Key的相同概念。
例如:
var arr = new Array();
arr[2] = 'hi';
arr[3] = 'hello';
arr[4] = 'how are you';
arr[12] = 'i am fine';
arr.next(3); // returns 4
arr.next(4); // returns 12
arr.next(2); // returns 3
arr.next(12); // returns 2
arr.prev(2); // returns 12
答案 0 :(得分:4)
这是一个回答的问题:http://plnkr.co/edit/x6stJnXzWzwY197csTHB?p=preview
如果您有一系列商品。第一个元素始终位于0
位置,最后一个元素位于array.length-1
位置。向数组添加元素就像
arr.push("January");
让我们假设您在阵列中有很多东西,并且您希望以固定数量循环它。不一定是1,也许是4.当你通过数组的末尾时,你也想回来。
第一个问题是数组是固定长度,你的循环数(偏移量)可能会超过数组的长度。
解决方案是使用模数运算符%
,它在除法后返回余数。
这意味着((current)+offset)%lengthOfArray
将返回正确的位置。
Array.prototype.move = function(i) {
this.current = (this.current + i) % this.length;
return this[this.current];
};
在您引用的问题上标记为正确的答案有一个很大的缺陷。
Array.prototype.current = 0;
表示所有数组将共享相同的当前值。最好像这样声明数组:
var arr = []; //Creates an array
arr.current = 0;
完整源代码:
Array.prototype.move = function(i) {
this.current = (this.current + i) % this.length;
return this[this.current];
};
var arr = []; //Creates an array
arr.current = 0; // Better than overriding array constructor
arr.push("January");
arr.push("February");
arr.push("March");
arr.push("April");
arr.push("May");
arr.push("June");
arr.push("July");
arr.push("August");
arr.push("September");
arr.push("October");
arr.push("November");
arr.push("December");
console.log(arr.move(1));
console.log(arr.move(1));
console.log(arr.move(1));
console.log(arr.move(1));
console.log(arr.move(4));
console.log(arr.move(12));
答案 1 :(得分:1)
使用其他SO答案,这里有一些基本功能可以满足您的需求:
Array.prototype.next = function(i) {
do {
if (this[++i] != undefined) {
return i;
}
} while (i < this.length);
return null;
};
Array.prototype.prev = function(i) {
do {
if (this[--i] != undefined) {
return i;
}
} while (i > 0);
return null;
};
隐含创建的索引的值为undefined
。
答案 2 :(得分:1)
试试这个:
var arr = new Array();
arr[2] = 'due';
arr[3] = 'hello';
arr[4] = 'quattro';
arr[12] = 'i am fine';
Array.prototype.next = function(n,_k){
if(typeof this !== "object") return false;
_k = n;
n = (typeof n === "undefined" || n+1 == this.length) ? 0 : n + 1;
for(n; this.length > n+1; n++){
if(typeof this[n] !== "undefined") return this[n]; // return element value if you want only index use "return n" ... this is for all return
}
for(n = 0;n == _k; n++){
if(typeof this[n] !== "undefined") return this[n];
}
return false;
}
Array.prototype.prev = function(n,_k){
if(typeof this !== "object") return false;
_k = n;
n = (typeof n === "undefined" || n == 0) ? this.length : n-1;
for(n; n > 0; n--){
if(typeof this[n] !== "undefined") return this[n];
}
for(n = 0;n == _k; n--){
if(typeof this[n] !== "undefined") return this[n];
}
return false;
}
var el = arr.next(12);
var el2 = arr.prev(12);
console.log(el);
console.log(el2);
jsfiddle 中的
答案 3 :(得分:0)
const calcIndex = (max, diff) => {
const limit = max + 1;
return (limit + diff) % limit;
}
允许您移动0 ... n的边界,具有正差或负差。例如
如果我们需要经历0 ... 4:
calcIndex(4, 0) => 0
calcIndex(4, 1) => 1
calcIndex(4, 2) => 2
calcIndex(4, 3) => 3
calcIndex(4, 4) => 4
calcIndex(4, 5) => 0
calcIndex(4, 6) => 1
calcIndex(4, -1) => 4
calcIndex(4, -2) => 3