2011-11-24 15 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

एक नाबालिग करना (ऑफ-विषय) बिंदु: आप 'लेबल' का उपयोग कर रहे हैं: 'none'''। निश्चित रूप से 'लेबल: शून्य' (या 'लेबल' संपत्ति को छोड़कर) इसका प्रतिनिधित्व करने के लिए एक और सटीक तरीका होगा? जैसा कि लिखा गया है, मैं उम्मीद करता हूं कि यूआई में वास्तव में "कोई नहीं" शब्द प्रस्तुत किया जाएगा। – 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

एफडब्ल्यूआईडब्ल्यू (और थोड़ा सा विषय) लेकिन मैं आदेश बनाए रखने के लिए सरणी की सरणी का उपयोग नहीं करता। ऑर्डर के लिए चाबियों की एक सरणी का उपयोग करें और बटन ऑब्जेक्ट को जैसा रखें। var बटन = {...}; var बटनऑर्डर = ['लॉगिन', 'शामिल', 'घर']; इस तरह आपको ऑर्डर की आवश्यकता होने पर केवल सरणी को फिर से करना होगा, और जब आपको आइटम की आवश्यकता होती है तो तत्काल लुकअप कर सकते हैं। – 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 या तो true या false का मूल्यांकन करने के लिए मूल्यांकन करता है और अधिक , इस पर निर्भर करता है कि button में 'join' एक कुंजी के रूप में है। (The in operator एक नियमित रूप से जावास्क्रिप्ट ऑपरेटर, नहीं कुछ 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])) 
संबंधित मुद्दे