Clojure:通过一次迭代重命名并从地图中选择键

Ash*_*her 1 clojure

在Clojure中,我想要从地图中重命名键和选择键.简单的做法是:

(-> m
    (rename-keys new-names)
    (select-keys (vals new-names)))
Run Code Online (Sandbox Code Playgroud)

但这将在整个地图上两次.有没有办法用一次迭代来做到这一点?

Leo*_*tny 7

当然,有一种方法可以通过一次迭代来完成.

你可以使用reduce-kv函数来做到这一点:

(reduce-kv #(assoc %1 %3 (get m %2)) {} new-names)
Run Code Online (Sandbox Code Playgroud)

或只是一个for循环:

(into {} (for [[k v] new-names] [v (get m k)]))
Run Code Online (Sandbox Code Playgroud)

如果你想要一个很简单的一段代码,你可以使用fmap函数algo.generic:

(fmap m (map-invert new-names))
Run Code Online (Sandbox Code Playgroud)