将映射键和值转换为字符串数组

Loc*_*rde 6 clojure

如何将clojure映射转换为字符串,几乎是键值对,如下所示:

Clojure数据:

(def data { :starks "Winter is coming" :Lannisters "Hear me roar" })
Run Code Online (Sandbox Code Playgroud)

我想将上面的内容转换为

"starks" "winter is coming" "Lannisters" "hear me roar"
Run Code Online (Sandbox Code Playgroud)

我不想要任何标识符/分隔符,但显然"starks"应该始终遵循"winter is coming"

我试过这个:

(str (keys data) (vals data))
Run Code Online (Sandbox Code Playgroud)

哪个输出:

"(:starks :Lannisters)(\"Winter is coming\" \"Hear me roar\")"
Run Code Online (Sandbox Code Playgroud)

这根本不是我想要的......

  • 地图数据键和值并不总是相同,因此它需要是通用的
  • 总会只有一个级别,因为值不会包含嵌套的地图等.

编辑

我实际上想要做的事情:

我试图用clojure 索引几千个Neo4j节点.为了帮助我完成这项任务,我正在使用Neocons Clojure neo4j库.

根据文档,add-to-index接受属性和值如下:

(nn/add-to-index (:id node) (:name idx) "username" "joe")))
Run Code Online (Sandbox Code Playgroud)

在我上面的例子中,它看起来像

(nn/add-to-index (:id node) (:name idx) "starks" "winter is coming" "Lannisters" "Hear me roar")))
Run Code Online (Sandbox Code Playgroud)

现在,我有我的节点,我可以访问节点属性,(:data node)并给我一个clojure地图.

该属性在节点与节点之间存在很大差异,因此我试图弄清楚如何以它理解的方式将该映射传递给库.

Marius Danila的回答让我几乎到了那里.

(map name (apply concat data))
Run Code Online (Sandbox Code Playgroud)

仍抱怨第三个参数,因为它有结果的括号.

那么,我怎样才能做到这一点?我是否只需要编写大量的if-not块来自己构建属性?

谢谢

Mar*_*ila 8

这应该做的伎俩:

(map name (apply concat data))
Run Code Online (Sandbox Code Playgroud)

可以将映射视为一系列键值对,而这些键值对又表示为2个元素的数组.我们将这些对连接起来,然后我们从关键字和字符串中提取名称(对于字符串,这不做任何事情,对于关键字,它返回没有':'的位).

从您发布的代码中,我猜你会像这样使用它:

(apply nn/add-to-index (list* (:id node) (:name idx) (map name (apply concat data))))
Run Code Online (Sandbox Code Playgroud)


小智 2

(nn/add-to-index ...)函数只接受四个参数。节点、索引和一个键/值对。所以你也必须循环遍历你的数据。

(doseq [[k v] data]
  (nn/add-to-index (:id node) (:name idx) (name k) (clojure.string/lower-case v))))
Run Code Online (Sandbox Code Playgroud)

str与Clojure 中的函数不同,该add-to-index函数受到更多限制,并且根本不接受可变参数列表。