Clojure:通过一次迭代从地图中重命名和 select 键

Clojure: Rename and select keys from map with one iteration

在 Clojure 中,我想重命名映射中的键和 select 键。 简单的方法是:

(-> m
    (rename-keys new-names)
    (select-keys (vals new-names)))

但这会遍历整个地图两次。 有没有一种方法可以一次迭代完成?

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

您可以使用 reduce-kv function:

(reduce-kv #(assoc %1 %3 (get m %2)) {} new-names)

或者只是一个 for 循环:

(into {} (for [[k v] new-names] [v (get m k)]))

如果你想要一段非常简单的代码,你可以使用 fmap function from algo.generic library:

(fmap m (map-invert new-names))