如何在clojure中的哈希映射中插入if

时间:2014-02-19 02:45:51

标签: clojure hashmap structure

这是有效的:

{:a :v (if true :f) :r }

这不是

{:a :v (if true {:f :r}) }

因为它想在结构中放置一个新的hashmap

我需要在if中返回一个特殊的结构(我已经忘记了它的名字) 它包含键和值,因此它被插入到哈希映射中。

由于

3 个答案:

答案 0 :(得分:3)

这是你需要的吗?

(merge {:a :v} (if true {:f :r}))
=> {:f :r, :a :v}

答案 1 :(得分:3)

第二种情况失败不是因为if表单返回了错误类型的值,而是因为地图包含奇数个项目。地图文字必须包含偶数个表单,if是单个表单。

有几种方法可以在Clojure中向地图添加内容。

您可以将conj与vector或map参数一起使用:

(conj {:a :v} [:f :r])  ;;=> {:f :r, :a :v}
(conj {:a :v} {:f :r})  ;;=> {:f :r, :a :v}

您可以将assoc与key和val一起用作单独的参数:

(assoc {:a :v} :f :r)   ;;=> {:f :r, :a :v}

或者您可以将merge与两个(或更多)地图一起用作参数:

(merge {:a :v} {:f :r}) ;;=> {:f :r, :a :v}

您正在考虑的特殊结构可能是MapEntry。这就是通过在地图上调用seq创建的seq中的项目。

例如:

(seq a-map)                ;;=> ([:a :v] [:f :r])
(first (seq a-map))        ;;=> [:a :v]
(-> a-map seq first class) ;;=> clojure.lang.MapEntry

地图条目的外观和行为就像矢量一样,只需添加一个。您可以使用keyval函数分别访问密钥和val(实际上相当于(get map-entry 0)(get map-entry 1))。

(key map-entry) ;;=> :a
(val map-entry) ;;=> :v

您可以conj将地图条目添加到地图上,就像您可以使用矢量一样。

答案 2 :(得分:2)

条件线程宏通常对此类事情有帮助。 特别是如果您已经在使用它们对数据应用一系列转换。这是创建http标头

的草图
(let [compressed? true
      custom-header? false]

    (-> {:content-type "text/plain"}
        (cond-> compressed? (assoc :content-encoding "gzip"))
        (cond-> custom-header? (assoc :my-custom-header "foo"))
        clojure.walk/stringify-keys))

;=> {"content-encoding" "gzip", "content-type" "text/plain"}