Clojure对数组元素执行map函数

时间:2017-12-13 23:19:06

标签: dictionary clojure

我已经定义了这样的人

(def persons 
  '({:id 1 :name "olle"} 
    {:id 2 :name "anna"} 
    {:id 3 :name "isak"} 
    {:id 4 :name "beatrice"}))

我想在这里像这个命令的人那样映射元素

(map :id persons)
(1 2 3 4)

然而,术语:id将在括号内[:id]。如何取消括号以便以

的形式显示功能
(map [:id] persons) 

执行与

相同的操作
(map :id persons)

此外,如果每列显示一个数字,其中:id为标题,那将是很好的。

4 个答案:

答案 0 :(得分:2)

(def persons
  '( {:id 1 :name "olle"}
     {:id 2 :name "anna"}
     {:id 3 :name "isak"}
     {:id 4 :name "beatrice"}))


(mapv (first [:id]) persons) => [1 2 3 4]

答案 1 :(得分:1)

从评论中我假设您想要按顺序提取一些键。这可以通过juxt来完成。 E.g:

user=> (map (juxt :id :name) persons)
([1 "olle"] [2 "anna"] [3 "isak"] [4 "beatrice"])

或者,如果你真的需要一个向量,请使用(apply juxt [:id :name])

答案 2 :(得分:0)

这是你想要的吗?

(defn map' [keys records]
  (map #(select-keys % keys) records))

(map' [:id] persons);;=>({:id 1} {:id 2} {:id 3} {:id 4})

答案 3 :(得分:0)

您的意思是数据结构看起来像这个吗?

(def persons 
  '({[:id] 1 :name "olle"} 
    {[:id] 2 :name "anna"} 
    {[:id] 3 :name "isak"} 
    {[:id] 4 :name "beatrice"}))

如果是,此代码将解决问题:

user=> (mapv #(get % [:id]) persons)
[1 2 3 4]