2011-11-24 16 views
11

Mam następujący obiektodkrycie przez klucza obiektu w underscore.js

{ join: {} } 

Chciałbym znaleźć to domyślny obiekt z tablicy poniżej

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

Chciałbym pętli tablica i dopasuj klucz, w tym przypadku 'join'.

To, co mam tak daleko:

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

Jest to pierwszy raz użyłem podkreślenia po wysłuchaniu tyle o tym. za pomoc, bardziej mile widziana

+3

jeden drobny (off-topic) point: Używasz 'label: 'none''. Z pewnością "label: null" (lub pomijając właściwość 'label') byłby dokładniejszym sposobem reprezentowania tego? Jak napisałem, spodziewałbym się, że słowo "none" zostanie wyrenderowane w interfejsie użytkownika. – davidchambers

+0

Dobry wskaźnik - dziękuje – Chin

Odpowiedz

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

Problemem jest to, że używasz nieoptymalne struktury danych. To byłoby bardziej sensowne i produkować prostszy kod:

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) 

Być może używasz tablicę ponieważ kolejność przycisków jest bardzo ważne. W tym przypadku, chciałbym użyć tablicy tablic:

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

Dzięki za wskaźniki - mam myśleć o strukturze danych, które naprawdę pomogły. – Chin

+11

FWIW (i trochę poza tematem), ale nie używałbym tablic tablic do zachowania porządku. Użyj szeregu klawiszy, aby uporządkować i odznaczyć obiekt przycisków tak jak jest. var buttons = {...}; var buttonsOrder = ['login', 'join', 'home']; W ten sposób musisz tylko powtarzać tablice, gdy potrzebujesz zamówienia, i możesz wykonać natychmiastowe wyszukiwanie, gdy potrzebujesz tego przedmiotu. – webnesto

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

gdzie _.keys(butt_to_find) ocenia się ['join'] (tablicę zawierającą klucze butt_to_find) _.keys(butt_to_find)[0] ocenia się 'join' (pierwszy element wspomnianego zbioru) i _.keys(butt_to_find)[0] in button ocenia albo true lub false , w zależności od tego, czy button zawiera 'join' jako klucz. (The in operator jest zwykłym operatorem JavaScript, a nie coś dodane przez underscore.js.)

+0

bardzo doceniane dzięki za to – 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]) 
}) 

Można również przejść do biblioteki lodash (spadek w wersji podkreślenia) i zrobić to

_.compact(_.pluck(defs,_.keys(def)[0])) 
Powiązane problemy