Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选定关键字上的Clojure烤肉串案例_Clojure - Fatal编程技术网

选定关键字上的Clojure烤肉串案例

选定关键字上的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

我想更改clojure中大地图中的某些键。 这些密钥可以出现在地图中的任何级别,但始终在所需密钥内

我正在考虑使用驼峰蛇串库,但需要它只更改所需密钥映射中的一组给定密钥。无论是在json中还是在映射中进行更改,这都无关紧要

   (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案例中有它们,但烤肉串是必需的。编辑问题以澄清问题