2011-04-19 19 views
6

आज दोपहर मेरे दिमाग को तोड़ने की कोशिश कर रहा है। मैं आम तौर पर क्लोजर और लिस्प के लिए बिल्कुल नया हूं। मेरे पास एक डेटा संरचना है जो नक्शे का एक वेक्टर है और मैं सभी मानचित्रों के किसी अन्य वेक्टर में किसी विशेष कुंजी के लिए सभी मान प्राप्त करना चाहता हूं।क्लोजर - हैशपैप्स के वेक्टर से मूल्य निकालें

उदाहरण के लिए, मान लीजिए कि इस नक्शे myvec करने के लिए बाध्य की वेक्टर है करते हैं:

[ { "key1" "value1" "key2" "value2"} {"key1" "value3" "key2" "value4"} ] 

और मैं एक वेक्टर

[ "value1" "value3" ] 

जैसे प्रमुख के सभी मानों का बना हुआ लग रहा है कि चाहते हैं "कुंजी 1"

एक ही तरीका है मैं यह करने के बारे में सोच सकता है

(for [i (range (count(myvec)))] ((myvec i) "key1")) 
है

क्या कोई आसान तरीका है? ऐसा लगता है जैसे होना चाहिए।

धन्यवाद।

उत्तर

17

(map #(get % "key1") myvec) आपको बस इतना चाहिए। उपयोग करने पर विचार करें: चाबियों के रूप में "स्ट्रिंग्स" की बजाय कीवर्ड, हालांकि यह सामान्य रूप से बेहतर और अधिक मूर्खतापूर्ण है। इसके अलावा, आप तो के रूप में लिख सकते सिर्फ (map :key1 myvec)

+0

धन्यवाद। ठीक वही जो मेरे द्वारा खोजा जा रहा था। मैं एक क्वेरी से चाबियाँ और मूल्य खींच रहा हूं। मैं कुछ "राज्य: बंद" की तरह वापस आ गया हूं और एक हैशप स्थापित कर रहा हूं जैसे {"राज्य" "बंद"}। यही कारण है कि मैं इसका उपयोग नहीं कर रहा हूं: कीवर्ड। या फिर भी कीवर्ड का उपयोग करने का कोई तरीका है? –

+2

आप एक स्ट्रिंग को 'कीवर्ड' फ़ंक्शन वाले कीवर्ड में बदल सकते हैं। यदि आप कभी भी मानचित्र में कभी-कभी कुछ दिखते हैं, लेकिन उदाहरण के लिए '({{kv] mymap] [(कीवर्ड के) v]))' 'मानचित्र में सभी कुंजी को कनवर्ट करेगा) कीवर्ड (मानते हैं कि वे वर्तमान में तार हैं)। – amalloy

8
(let [v [{"key1" "value1", "key2" "value2"} {"key1" "value3", "key2" "value4"}]] 
    (vec (map #(% "key1") v))) 

आप अपनी चाबी के लिए कीवर्ड का उपयोग करते:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"}]] 
    (vec (map :key1 v))) 

आप नक्शे की जरूरत नहीं है जब nil मान शामिल नहीं करना चाहते हैं दी गई कुंजी:

(let [v [{:key1 "value1", :key2 "value2"} {:key1 "value3", :key2 "value4"} {:key2 "value5"}]] 
    (vec (keep :key1 v))) 
संबंधित मुद्दे