2017-01-08 38 views
0

考慮以下幾點:獲得下鍵中的一組在一個Javascript對象鍵(圓形)的

var obj = {a:1, b:2, c:3, d:4, e:5, f:6}; 

注意,這不是一個數組(除非它是在JS和有一種方法來映射他們)

我現在有一個要求得到下一個關鍵,給定一個關鍵。它也需要是「通告」。所以findNext('c')d,而findNext('f')a

這裏是我想出了:

var obj = {a:1, b:2, c:3, d:4, e:5, f:6}; 
 
console.log (findNext('e',obj), " is after e"); 
 
console.log (findNext('f',obj), " is after f"); 
 
console.log (findNext('a',obj), " is after a"); 
 

 

 

 
function findNext (key,obj) 
 
{ 
 
    var size = Object.keys(obj).length; 
 
    var i; 
 
    for (i=0; i<size; i++) 
 
    { 
 
     if (Object.keys(obj)[i] == key) 
 
     break; 
 
    } 
 
    i = (i + 1) % size; 
 
    return Object.keys(obj)[i]; 
 
    
 
}

有沒有更好的方式來做到這一點,因爲所有鍵哈希?我可以避免不必迭代到X找到下一個(X)?

感謝

+0

定義*「下一個」 *。對象屬性的順序並不一致,這取決於它們是如何構建的,不能依賴 – charlietfl

+0

爲什麼不只是做一個'Object.keys(obj).length'和'if size == Object.keys(obj).length - 1,size = 0?' –

+0

不太確定發佈到這個問題的答案和評論發生了什麼?他們消失了 - 也許是因爲有人選擇投票結束這個問題? charlietfl - 是的,我同意 - 在迭代時,接下來將是該特定系統中的下一個。 A. Lau:那就是我在第二到最後一行所做的事情? (%而不是if) – user1361529

回答

2

這樣吧,雖然你需要處理else,也是我使用es6但你可以粘貼babel.io得到es5輸出

let obj = {a:1, b:2, c:3, d:4, e:5, f:6}; 

const findNext = (key, obj) => { 
    const keys = Object.keys(obj); 
    const len = Object.keys(obj).length; 

    if (keys.indexOf(key) > -1) { 
    const nextIndex = (keys.indexOf(key) + 1) % len; 
    var next = keys[nextIndex]; 
    return { [next]: obj[next] }; 
    } 
} 
相關問題