2012-07-20 30 views
5

मैं क्लोजर के लिए बहुत नया हूं और ऐसा कुछ ऐसा करने का तरीका नहीं ढूंढ रहा है जो मुझे यकीन है कि यह छोटा है। मैंने assoc फ़ंक्शन को देखा है क्योंकि मुझे लगता है कि यह उत्तर हो सकता है, लेकिन यह काम नहीं कर सकता है।क्लोजर 101 मानचित्र में वैक्टरों को मिलाकर

मैं क्या है:

keys => [:num, :name, :age] 
people => [ [1, "tim", 31] [2, "bob" 33] [3, "joe", 44] ] 

मुझे क्या करना चाहते हैं नक्शे का एक वेक्टर ही बनाना है, प्रत्येक नक्शे लग रहा है

तरह
[ { :num 1, :name "tim", :age 31 } 
    { :num 2, :name "bob", :age 33 } 
    { :num 3, :name "joe", :age 44 } ] 

मेरे OO मस्तिष्क छोरों का एक समूह लिखने के लिए मुझे चाहता है, लेकिन मुझे पता है कि एक बेहतर तरीका है कि मैं बड़ी एपीआई में थोड़ा सा खो गया हूं।

+1

"मेरा ओओ मस्तिष्क चाहता है कि मैं लूप का एक गुच्छा लिखूं" << लूप्स अनिवार्य प्रोग्रामिंग की विशेषता है, ओओपी नहीं। दोनों ऑर्थोगोनल हैं। – missingfaktor

उत्तर

10

इस प्रयास करें:

(def ks [:num :name :age]) 
(def people [[1 "tim" 31] [2 "bob" 33] [3 "joe" 44]]) 

(map #(zipmap ks %) people) 

=> ({:num 1, :name "tim", :age 31} 
    {:num 2, :name "bob", :age 33} 
    {:num 3, :name "joe", :age 44}) 

सूचना है कि मैं ks बजाय keys इस्तेमाल किया कुंजी के नामकरण के लिए, keys के रूप में Clojure में निर्मित एक प्रक्रिया है और यह एक बुरा विचार यह फिर से परिभाषित करने के लिए। यह भी ध्यान रखें कि map एक आलसी अनुक्रम देता है; clojure.core/partial का उपयोग कर

(vec (map #(zipmap ks %) people)) 

=> [{:num 1, :name "tim", :age 31} 
    {:num 2, :name "bob", :age 33} 
    {:num 3, :name "joe", :age 44}] 
+1

हां! यही वही है जो मैं खोज रहा था और थोड़ी देर के किनारों के आसपास नृत्य कर रहा था। धन्यवाद! – rooftop

+0

मेरी खुशी! :) –

1

एक बालक थोड़ा और अधिक सुंदर,: अगर आप पूरी तरह से एक सदिश की जरूरत है, तो ऐसा करने

(map (partial zipmap keys) people) 

और के रूप में ऑस्कर सुझाव दिया, आप अपने keys लिए कोई भिन्न नाम का उपयोग करना चाहिए।

+0

ओस्कर क्या पूछ रहा है उससे मेल खाने के लिए 'mapv' का उपयोग करें। – sortega