我把以下功能放在一起。它应该采用嵌套(多层)地图并返回一系列平面地图;但是,它当前返回序列中的序列。
有谁知道为什么序列嵌套在另一个序列中?
(defn collapse [data & keys-coll]
(if (map? data)
(for [[k v] data]
(collapse v (if (nil? keys-coll)
(conj [] k)
(conj (into [] keys-coll) k))))
(hash-map (flatten keys-coll) data)))
(collapse {"a" {2011 [["a" 2011 "dan"] ["a" 2011 "ari"]] 2010 [["a" 2010 "jon"]]}})
结果:
( ({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]} {("a" 2010) [["a" 2010 "jon"]]}) )
预期/期望结果(注意序列,而不是上面序列中的序列):
({("a" 2011) [["a" 2011 "dan"] ["a" 2011 "ari"]]} {("a" 2010) [["a" 2010 "jon"]]})
注意:预期结果是一系列地图;每个地图都由复合键和嵌套向量组成。
答案 0 :(得分:1)
您在另一个序列中获取序列的原因是for
返回一个惰性序列。因为每次collapse
遇到一张地图时都会调用它,而你提供的地图会深入两层,你会得到两层深度嵌套的序列。
快速修复:将flatten
放在for
前面,如下所示:
(defn collapse [data & keys-coll]
(if (map? data)
(flatten
(for [[k v] data]
(collapse v (conj keys-coll k))))
(hash-map (flatten keys-coll) data))
(请注意,您也可以删除if
语句)。也许不是最优雅的解决方案,但现在正遭受大脑冻结......