2011-11-24 41 views
11

我有以下對象發現在對象鍵underscore.js

{ join: {} } 

我想找到它從數組默認對象下面

[ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 

我想通過循環數組並匹配密鑰,在這種情況下爲'join'

這是我到目前爲止有:

var butt_to_find = { join: {} } 
var all_buttons = 'array above' 
var matching = _.find(all_buttons, function(default_button){ 
return if default_butt key @ 1 is the same as butt_to_find key @ 1; 
    }); 

這是我第一次聽到這麼多關於它後使用下劃線。 任何幫助,超過歡迎

+3

一個次要(題外話):你正在使用'label:'none''。當然,'label:null'(或者省略'label'屬性)會更準確地表示這種情況嗎?正如所寫,我希望單詞「無」實際上在UI中呈現。 – davidchambers

+0

好的指針 - 感謝 – Chin

回答

19
var buttons = [ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 

_.find(buttons, function (button) { return 'join' in button }) 

的問題是,您使用的是次優的數據結構。這會更有意義,併產生更簡單的代碼:

var buttons = { 
    login: {label: 'Login', url: '#login'}, 
    join: {label: 'Join', url: '#join', theme: 'a'}, 
    home: {label: 'none', icon: 'home', url: '#', theme: 'a'} 
} 

buttons.join // equivalent to the `_.find` line in the first example (but much simpler) 

也許您正在使用數組,因爲按鈕的順序很重要。在這種情況下,我會使用一個數組的數組:

var buttons = [ 
    ['login', {label: 'Login', url: '#login'}], 
    ['join', {label: 'Join', url: '#join', theme: 'a'}], 
    ['home', {label: 'none', icon: 'home', url: '#', theme: 'a'}] 
] 

_.find(buttons, function (button) { return button[0] === 'join' }) 
+1

感謝指針 - 讓我想起了真正幫助的數據結構。 – Chin

+11

FWIW(和一些小題目),但我不會使用數組數組來保留順序。按順序使用一組鍵,並按原樣保持按鈕對象。 var buttons = {...}; var buttonsOrder = ['login','join','home'];這樣,您只需要在需要訂單時迭代數組,並且可以在需要項目時立即進行查找。 – webnesto

4
var matching = 
(_.find 
    (all_buttons, 
    function (button) 
    { return _.keys(butt_to_find)[0] in button; 
    } 
) 
); 

其中_.keys(butt_to_find)的計算結果爲['join'](含有butt_to_find鍵的陣列),_.keys(butt_to_find)[0]計算結果爲'join'(所述陣列的第一個元素),和_.keys(butt_to_find)[0] in button計算結果爲truefalse取決於button是否包含'join'作爲關鍵字。 (The in operator是常規的JavaScript操作,不是通過添加underscore.js)

+0

非常感謝這個 – Chin

1
var def = {join: {}} 
var defs = [ 
    { login: { label: 'Login', url: '#login' } }, 
    { join: { label: 'Join', url: '#join', theme: 'a' } }, 
    { home: { label: 'none', icon: 'home', url: '#', theme: 'a' } } 
] 
_.find(defs,function(item,key){ 
    return _.has(item,_.keys(def)[0]) 
}) 

你也可以切換到lodash庫(在下劃線的版本下降),併爲此

_.compact(_.pluck(defs,_.keys(def)[0]))