【问题标题】:Convert nested vector maps in clojure在 clojure 中转换嵌套的矢量图
【发布时间】:2016-03-10 21:51:01
【问题描述】:

我需要以同样的方式收集:c/name 值并将其传输到嵌套向量到第一级。

输入示例:

[:a/name "name" :a/vals [{:b/val [{:c/name "one"}{:c/name "two"}]}
                         {:b/val [{:c/name "three"}]}]]

输出:

[:a/name :a/vals "one, two, three"]

【问题讨论】:

  • 这似乎是一种奇怪的数据输入格式。它来自哪里?您能否尝试解决问题并向我们展示您的尝试?
  • 这看起来像是对这个问题的另一种尝试:stackoverflow.com/questions/35878126/…

标签: clojure


【解决方案1】:

这会从输入中产生输出,这是你想要的吗?

(defn f [[k1 _ k2 rels]]
  [k1 k2
   (clojure.string/join ", "
     (map :c/name (apply concat (mapcat vals rels))))])

【讨论】:

  • 非常感谢,这正是我想要的!但是如果我想添加一些条件,代码会发生什么变化: [:a/name "name" :a/vals [{:b/val [{:c/name "one" :c/u "1"}{: c/name "two" :c/u "2"}]} {:b/val [{:c/name "three" :c/u "1"}]}]] 添加到结果 if :c/ u = "1" 或 :c/u 丢失
  • 是的,你可以过滤 rels,比如(filter #(or (not (contains? :c/u %) (= (:c/u %) "1")) rels)
  • 感谢您的解决方案!但是你能用过滤器写整个脚本吗,我有一些错误尝试在函数中使用这个过滤器。
  • 我试过这种方式(def res [:a/name "name" :a/vals [{:b/val [{:c/name "one" :c/u "1"} {:c/name "二" :c/u "2"}]} {:b/val [{:c/name "三" :c/u "1"}]}]]) (defn f [[ k1 _ k2 rels]] [k1 k2 (clojure.string/join ", " (map :c/name (apply concat (mapcat vals (filter #(or (not (contains? % :c/u))) (= ( :c/u %) "1")) rels)))))]) (prn (f res)) 我得到没有过滤的值 [:a/name :a/vals "one, two, three"]
  • 所以.. 我希望只有带有 :c/u = "1" 的项目被过滤,所以结果应该如下: [:a/name :a/vals "one, three"]
猜你喜欢
  • 2016-11-14
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多