2012-07-20 10 views
5

私はClojureにはとても新しく、何かをする方法が見つからないとは思えません。私はassocの機能を見てきましたが、これは答えかもしれないと思っていますが、機能させることはできません。clojure 101ベクトルをマップに結合する

は私が持っているもの:私は何をしたいか

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

マイOO脳は私がループの束を書きたい

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

のように各マップが見え、マップのベクトルを作成しています、私は大きいAPIでほんの少しだけ失われたよりよい方法があることを知っています。

+1

"私のOOの脳は私にループの束を書いてほしい" <<ループはOOPではなく命令的プログラミングの特徴です。 2つは直交している。 – missingfaktor

答えて

10

はこれを試してみてください:keysはClojureの中に内蔵された手順であり、それはそれを再定義することは悪い考えだと、私は、キーの命名にksの代わりkeysを使用

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

注意してください。また、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

Óscarが求めているものと一致させるために 'mapv'を使います。 – sortega

関連する問題