Y. *_*tin 5 conditional clojure map filter
我有一个函数想要根据优先顺序从地图中提取一个值.目前我正在将它作为一个嵌套的if结构,这是非常可怕的.我不得不相信有更好的方法.
虽然这项工作有更好的方法吗?
(defn filter-relatives [relatives]
(if(contains? relatives :self)
(relatives :self)
(if(contains? relatives :north)
(relatives :north)
(if(contains? relatives :west)
(relatives :west)
(if(contains? relatives :east)
(relatives :east)
(relatives :south)
)
)
)
)
)
)
)
Run Code Online (Sandbox Code Playgroud)
(some relatives [:self :north :west :east :south])
Run Code Online (Sandbox Code Playgroud)
关于什么:
(defn filter-relatives [relatives ordered-filters]
(first (filter identity (map relatives ordered-filters))))
Run Code Online (Sandbox Code Playgroud)
样品运行:
user=> (filter-relatives {:a 1 :b 2 :c 3} [:z :b :a])
2
Run Code Online (Sandbox Code Playgroud)
如果nil和false不是可能的值,其他答案都很好.如果是,你可以使用类似的东西
(if-let [e (some (partial find relatives)
[:self :north :west :east :south])]
(val e)
:no-key-found)
Run Code Online (Sandbox Code Playgroud)
例如
(if-let [e (some (partial find relatives)
[:self :north :west :east :south])]
(val e)
:no-key-found)
; => false
(if-let [e (some (partial find {})
[:self :north :west :east :south])]
(val e)
:no-key-found)
; => :no-key-found
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
169 次 |
| 最近记录: |