我在找类似于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)))我是不是不知道有没有一个标准函数可以完全满足这个需求呢?如果没有,其他语言-e.g.,python.ruby.haskell--有没有这个函数的名字?
发布于 2013-05-29 06:54:08
映射是对其键进行操作的函数:
({: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 [] ...,或者用mapv替换map。
发布于 2013-05-29 12:27:21
关键字本身就是函数(它们实现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))发布于 2013-05-29 15:09:41
map是您要查找的函数:
(map {:a 1 :b 2 :c 3} [:a :c])
=> (1 3)这之所以有效,是因为哈希图本身作为一个函数(即实现clojure.lang.IFn)工作,该函数返回给它的任何键的值。
https://stackoverflow.com/questions/16802381
复制相似问题