连接地图中的所有字段

Concatenate all fields within map

在 clojure 中,我希望能够为列表中的每个映射连接映射中的所有字段(使用分隔符)。

对于以下结果我希望能够得到:

(def h '({:key1 "one" :key2 "descone"} {:key1 "two" :key2 "destwo"}))

我想要的结果:

({one,descone} {two,destwo})

我做了以下但我无法得到正确的结果

(def h '({:key1 "one" :key2"descone"} {:key1 "two" :key2"destwo"}))
(~@(apply interpose ","  (map (juxt :key1 :key2) h))))

我得到的是:

one,desconetwo,destwo

编辑

场景如下:我们使用jdbc从postgres获取所有记录。记录返回如下:({:col1 "one" :col2 "descone"} {:col1 "two" :col2 "destwo"})。现在,我们需要用分隔符连接所有列并将其作为主键并将其插入回 postgres 中的新 table。

我假设你想 return 一个字符串,因为你谈到逗号作为分隔符。我进一步假设当您说“所有字段”时,您的意思是“每个 key-value 对的所有值”,并且每个值都是一个字符串。在这种情况下,以下内容可以满足您的需求。

user> (str "(" (clojure.string/join " " (map #(str "{" (clojure.string/join ","  (vals %)) "}") h)) ")")
"({one,descone} {two,destwo})"
user> 

代码所做的是首先获取每个地图的值并用逗号分隔符将它们连接起来,然后用左括号和右括号括起每个地图。然后它获取每个这样的字符串并将它们与一个 space 字符连接起来,然后用一个打开和关闭的括号将整个结果括起来。

编辑: 使编辑与问题相匹配。

由于您想生成一个包含数据库行的所有值的主键值,我假设您想要 return 的是一个字符串序列。其中每个字符串都是每个映射的所有值 以特定顺序 的连接,带有分隔符。假设这是正确的,这里是修改后的答案。

user> (map #(str "{" (clojure.string/join ","  ((juxt :key1 :key2) %)) "}") h)
("{one,descone}" "{two,destwo}")
user>