我正在寻找与select-keys类似的东西:
(desired-fn {:a 1, :b 2, :c 3, :d 4} [:a :d])
;= [1 4]
;; N.B. the order of the keys in the argument seq is preserved
(= (desired-fn (array-map :a 1, :b 2, :c 3, :d 4)
[:b :c])
(desired-fn (array-map :d 4, :c 3, :a 1, :b 2)
[:b :c]))
;= true
实施起来并不是特别困难,但我还没有想出一个好名字:
(defn select-values-corresponding-to-keys [m ks]
(for [k ks]
(get m k)))
我是否不知道满足这种需求的标准功能?如果没有,其他语言 - 例如,Python,Ruby,Haskell--是否有此功能的名称?
答案 0 :(得分:10)
地图是按键操作的功能:
({:a 1, :b 2} :a)
;=> 1
(map {:a 1, :b 2, :c 3, :d 4} [:a :d])
;=> (1 4)
(= (map (array-map :a 1, :b 2, :c 3, :d 4)
[:b :c])
(map (array-map :d 4, :c 3, :a 1, :b 2)
[:b :c]))
;=> true
如果您希望将结果作为向量,只需使用vec
或into [] ...
,或将map
替换为mapv
。
答案 1 :(得分:3)
关键字本身就是函数(它们实现IFn
),它们可以将自己看成一个映射并返回值,因此一个选项是使用juxt
:
(def keys-to-vals (juxt :b :c))
(= (keys-to-vals {:a 1, :b 2, :c 3, :d 4})
(keys-to-vals {:d 4, :c 3, :a 1, :b 2}))
所以基本上你想要的fn现在变成了:
(defn select-vals [map keys] ((apply juxt keys) map))
答案 2 :(得分:3)
map
是您正在寻找的功能:
(map {:a 1 :b 2 :c 3} [:a :c])
=> (1 3)
这是有效的,因为hashmap本身作为一个函数(即实现clojure.lang.IFn
),返回给定的任何键的值。
答案 3 :(得分:3)
user=> ((juxt :a :c) {:a 1 :b 2 :c 3})
[1 3]
答案 4 :(得分:1)
Jay Fields在一篇富有洞察力的博客文章@ http://blog.jayfields.com/2011/01/clojure-select-keys-select-values-and.html中探讨了这个功能以及其他一些相关功能。
(几分钟前,当我搜索“select-keys”时,我偶然发现了。)
我仍然想知道某个地方是否存在“规范”实施,所以我将这个问题保持开放。