选定关键字上的Clojure烤肉串案例
我想更改clojure中大地图中的某些键。 这些密钥可以出现在地图中的任何级别,但始终在所需密钥内 我正在考虑使用驼峰蛇串库,但需要它只更改所需密钥映射中的一组给定密钥。无论是在json中还是在映射中进行更改,这都无关紧要选定关键字上的Clojure烤肉串案例,clojure,Clojure,我想更改clojure中大地图中的某些键。 这些密钥可以出现在地图中的任何级别,但始终在所需密钥内 我正在考虑使用驼峰蛇串库,但需要它只更改所需密钥映射中的一组给定密钥。无论是在json中还是在映射中进行更改,这都无关紧要 (def my-map {:allow_kebab_or-snake {:required-key {:must_be_kebab ""}} :allow_kebab_or-snake2 {:optional-key {:required-ke
(def my-map {:allow_kebab_or-snake {:required-key {:must_be_kebab ""}}
:allow_kebab_or-snake2 {:optional-key {:required-key {:must_be_kebab ""}}}})
当前正在使用/walk/postwark replace,但担心它可能会更改未嵌套在:required key map中的键
(walk/postwalk-replace {:must_be_kebab :must-be-kebab} my-map))
嗯。。你能澄清一下:你想更改地图的键吗?!或者它们的关联值 离题:上面的地图不正确(有两个相同的键:allow_kebab_或_snake-i-m假设您只是在点下划线,而没有显示实际示例:) postwalk replace将用该值替换任何出现的键 因此,如果您知道确切的映射结构,您可以首先使用get in选择子结构,然后使用postwalk replace:
(walk/postwalk-replace {:must_be_kebab :mus-be-kebab}
(get-in my-map [:allow_kebab_or_snake :required-key]))
但是你必须assoc
你也应该考虑步态函数,如果交错的DS太复杂,构造你自己的特定算法。
这里是一个解决方案。由于需要控制转换何时发生/何时不发生,因此不能仅使用postwark
。您需要实现自己的递归,并在找到条件时从non-convert->convert更改上下文
(ns tst.clj.core
(:use clj.core clojure.test tupelo.test)
(:require
[clojure.string :as str]
[clojure.pprint :refer [pprint]]
[tupelo.core :as t]
[tupelo.string :as ts]
))
(t/refer-tupelo)
(t/print-versions)
(def my-map
{:allow_kebab_or-snake {:required-key {:must_be_kebab ""}}
:allow_kebab_or-snake2 {:optional-key {:required-key {:must_be_kebab ""}}}})
(defn children->kabob? [kw]
(= kw :required-key))
(defn proc-child-maps
[ctx map-arg]
(apply t/glue
(for [curr-key (keys map-arg)]
(let [curr-val (grab curr-key map-arg)
new-ctx (if (children->kabob? curr-key)
(assoc ctx :snake->kabob true)
ctx)
out-key (if (grab :snake->kabob ctx)
(ts/kw-snake->kabob curr-key)
curr-key)
out-val (if (map? curr-val)
(proc-child-maps new-ctx curr-val)
curr-val)]
{out-key out-val}))))
(defn nested-keys->snake
[arg]
(let [ctx {:snake->kabob false}]
(if (map? arg)
(proc-child-maps ctx arg)
arg)))
最终结果如单元测试所示:
(is= (nested-keys->snake my-map)
{:allow_kebab_or-snake
{:required-key
{:must-be-kebab ""}},
:allow_kebab_or-snake2
{:optional-key
{:required-key
{:must-be-kebab ""}}}} ))
对于这个解决方案,我使用了一些方便的函数只是一个左字段建议,它可能有效,也可能无效。这是处理SQL数据库时可能出现的问题,因为“-”被视为保留字,不能在标识符中使用。但是,在使用clojure时,在关键字中使用“-”是很常见的。在clojure中使用SQL时使用的许多抽象层将映射作为准备语句等的参数/绑定 理想情况下,所需要的是另一层抽象,它根据需要在烤肉串和蛇壳之间进行转换,具体取决于您要使用的方向,即sql或sql。这种方法的优点是,你不用在地图中穿行,而是在需要的时候进行转换
看一看谢谢,我需要更改烤肉串案例的密钥,json有效负载在snake案例中有它们,但烤肉串是必需的。编辑问题以澄清问题