如何移动到数组的prev / next索引键

时间:2013-12-12 12:49:20

标签: javascript jquery arrays

在这篇帖子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

4 个答案:

答案 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