2011-11-24 13 views
11

Ho il seguente oggettoconstatazione da chiave oggetto in underscore.js

{ join: {} } 

Mi piacerebbe trovare è oggetto di default dalla matrice sotto

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

mi piacerebbe ciclo attraverso la matrice e abbinare la chiave, in questo caso 'join'.

Questo è quello che ho finora:

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; 
    }); 

Questa è la prima volta che ho usato di sottolineatura dopo aver sentito così tanto su di esso. Qualsiasi aiuto, più che benvenuto

+3

Una minore (off-topic) point: stai usando l'etichetta ': none''. Sicuramente 'label: null' (o omettendo la proprietà' label') sarebbe più un modo più accurato per rappresentarlo? Come scritto, mi aspetterei che la parola "none" venga effettivamente visualizzata nell'interfaccia utente. – davidchambers

+0

Buon puntatore - grazie – Chin

risposta

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 }) 

Il problema è che si sta utilizzando una struttura di dati non ottimale. Ciò avrebbe più senso e produrrebbe un codice più semplice:

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) 

Forse si sta utilizzando un array perché l'ordine dei pulsanti è importante. In questo caso, mi piacerebbe utilizzare un array di array:

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

Grazie per i suggerimenti - mi ha fatto pensare alla struttura dati che ha davvero aiutato. – Chin

+11

FWIW (e un po 'fuori tema) ma non userei un array di array per mantenere l'ordine. Utilizzare una serie di tasti per ordinare e mantenere l'oggetto tasti così com'è. var buttons = {...}; var buttonsOrder = ['login', 'join', 'home']; In questo modo devi solo iterare gli array quando hai bisogno di un ordine e puoi effettuare ricerche immediate quando ti serve l'articolo. – webnesto

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

dove _.keys(butt_to_find) viene valutato come ['join'] (un array contenente le chiavi di butt_to_find), _.keys(butt_to_find)[0] restituisce 'join' (il primo elemento di detta matrice), e _.keys(butt_to_find)[0] in button restituisce sia true o false , a seconda che button contenga 'join' come chiave. (The in operator è un operatore di regolare JavaScript, non qualcosa di aggiunto da underscore.js.)

+0

molto apprezzato grazie per questo – 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]) 
}) 

È anche possibile passare alla libreria lodash (un calo di versione di sottolineatura) e fare questo

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