2012-07-20 30 views
5

Tôi rất mới với Clojure và dường như không thể tìm ra cách để làm điều gì đó mà tôi chắc chắn là tầm thường. Tôi đã xem xét các chức năng assoc như tôi nghĩ rằng đây có thể là câu trả lời, nhưng không thể làm cho nó hoạt động.clojure 101 kết hợp vectơ vào một bản đồ

Những gì tôi có:

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

Những gì tôi muốn làm là tạo ra một vector của bản đồ, mỗi bản đồ trông giống như

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

não OO tôi muốn tôi viết một loạt các vòng, nhưng tôi biết có một cách tốt hơn tôi chỉ mất một chút trong API lớn.

+1

"Bộ não OO của tôi muốn tôi viết một loạt các vòng lặp" << Vòng lặp là đặc điểm của lập trình bắt buộc, không phải là OOP. Hai là trực giao. – missingfaktor

Trả lời

10

Hãy thử điều này:

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

Chú ý rằng tôi sử dụng ks thay vì keys để đặt tên các phím, như keys là một thủ tục tích hợp sẵn trong Clojure và đó là một ý tưởng tồi để xác định lại nó. Cũng lưu ý rằng map trả về một chuỗi lười biếng; nếu bạn hoàn toàn cần một vector, sau đó làm điều này:

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

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

Có! Đó là chính xác những gì tôi đang tìm kiếm và đang nhảy múa quanh các cạnh của một thời gian. Cảm ơn! – rooftop

+0

Niềm vui của tôi! :) –

1

Một chút chút thanh lịch hơn, sử dụng clojure.core/partial:

(map (partial zipmap keys) people) 

Và như Óscar đề nghị, bạn nên sử dụng một tên khác cho keys của bạn.

+0

Sử dụng 'mapv' để khớp với những gì Óscar đang yêu cầu. – sortega

Các vấn đề liên quan