2013-12-12 47 views
2

在這篇文章中How to move to prev/next element of an array它告訴如何移動prev/next數組元素。如何移動到數組的上一個/下一個索引鍵

但我想爲上一個/下一個數組元素鍵相同的概念。

例:

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

有在JavaScript沒有關聯數組...陣列就沒有索引鍵。我不認爲你知道顯示的數組有'length = 13'。請詳細說明使用 – charlietfl

+0

澄清charlietf。創建arr [2]時,會隱式創建arr [0]和arr [1]。 –

+1

傳遞一個參數:'... prototype.next = function(x){...}',並設置'this.current = x'。在現實生活中,你還要檢查'x'確實是給出了等。 – Teemu

回答

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

+0

這返回元素值,我需要它返回元素鍵。但仍然感謝您的時間。 – rkaartikeyan

+1

嗨,:)很高興...所以...看到評論...爲了返回密鑰,你只需要改變行: 'if(typeof this [n]!==「undefined」)return this [n];'into'if(typeof this [n]!==「undefined」)return n;' - 'this [n];'是數組元素值...'n'是元素值。 – Frogmouth

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值。

4

這裏是一個plunker去的答案: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)); 
+0

感謝您的回答。 – rkaartikeyan

0
const calcIndex = (max, diff) => { 
    const limit = max + 1; 
    return (limit + diff) % limit; 
    } 

讓你與po一起移動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 
相關問題