我需要根据每个数组的确切值来分隔多个数组中的对象数组。 IE。
[
{"15/02" :date},
{"16/02" :date},
{"15/02" :date},
]
结果应为:
[
[
{"15/02" :date},
{"15/02" :date}
],
[
{"16/02" :date}
]
]
答案 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}] ]
函数,但我认为如果它是向量而不是(惰性)列表,则输出更容易阅读。