基于值在多个数组中拆分数组

时间:2017-05-08 23:22:58

标签: clojure

我需要根据每个数组的确切值来分隔多个数组中的对象数组。 IE。

[
  {"15/02" :date},
  {"16/02" :date},
  {"15/02" :date},
]

结果应为:

  [
      [
        {"15/02" :date},
        {"15/02" :date}
      ],
      [
        {"16/02" :date}
      ]
  ]

3 个答案:

答案 0 :(得分:2)

这将产生您正在寻找的答案:

(mapv val (group-by ffirst dates))

(哈希)映射是映射条目的sequable?。这里我们所遵循的对象是第一个map-entry(总是只有一个),在Clojure中表示为元组(2-vector),例如["15/02" :date]。从该对象我们需要按元组的第一个(map-entry键)元素进行分组。希望这能解释为什么ffirst能够获得需要成为group-by主题的字符串键。

答案 1 :(得分:2)

<强>注释

数据看起来不正确。

  • 向量中的每个映射都有一个条目,可能是 好吧是有序的一对。
  • 如果这些是精简记录,那么键和值肯定是 错误的方式,应该是

(def data [{:date "15/02"} {:date "16/02"} {:date "15/02"}])

然后是一个解决方案

(->> data (group-by :date) vals vec)
=> [[{:date "15/02"} {:date "15/02"}] [{:date "16/02"}]]

答案 2 :(得分:0)

在阅读评论后,我发现这不是重复。

您可以使用p功能完成所有艰苦工作。请参阅:

以下是行动中的代码:

frequencies

所以结果是一个Clojure映射,其中键是原始(唯一)值,val是每个值的出现次数。

我们可以添加一些代码来重复每个唯一值正确的次数以获得最终结果:

(def data [
           {"15/02" :date},
           {"16/02" :date},
           {"15/02" :date},
          ])

(frequencies data) => { {"15/02" :date} 2, 
                        {"16/02" :date} 1}

请注意,您并不真正需要两个(defn make-repeat-groups [freq-map] (vec (for [entry freq-map] (let [ [item reps] entry] (vec (repeat reps item)))))) (make-repeat-groups (frequencies data)) => [ [{"15/02" :date} {"15/02" :date}] [{"16/02" :date}] ] 函数,但我认为如果它是向量而不是(惰性)列表,则输出更容易阅读。