Clojure 如何迭代哈希的key/vals并返回数组?
我知道Clojure 如何迭代哈希的key/vals并返回数组?,clojure,Clojure,我知道doseq将迭代{…}文本的每个键/val,如本例所示:然而,doseq返回nil,我想迭代并返回一个值 我有一个key/val对象,如下所示: {:keyAAA [ val_element_one val_element_two val_element_three ] :keyBBB [ val_element_four val_element_five val_element_six ] :keyCCC [ val_element_seven val_element_eight v
doseq
将迭代{…}
文本的每个键/val,如本例所示:然而,doseq
返回nil
,我想迭代并返回一个值
我有一个key/val对象,如下所示:
{:keyAAA [ val_element_one val_element_two val_element_three ]
:keyBBB [ val_element_four val_element_five val_element_six ]
:keyCCC [ val_element_seven val_element_eight val_element_nine ]}
( :keyAAA :keyBBB :keyCCC )
[ val_element_one
val_element_two
val_element_three
val_element_four
val_element_five
val_element_six
val_element_seven
val_element_eight
val_element_nine ]
我想创建一个函数,返回如下值:
{:keyAAA [ val_element_one val_element_two val_element_three ]
:keyBBB [ val_element_four val_element_five val_element_six ]
:keyCCC [ val_element_seven val_element_eight val_element_nine ]}
( :keyAAA :keyBBB :keyCCC )
[ val_element_one
val_element_two
val_element_three
val_element_four
val_element_five
val_element_six
val_element_seven
val_element_eight
val_element_nine ]
我知道我可以使用(keys-map)
来处理这个特定的示例,但我正在尝试对每个key/val“元素”执行更复杂的操作。我需要一个在key/val对象上迭代并返回每个“元素”填充的列表/数组的函数。具体地说,我希望最终返回如下内容:
{:keyAAA [ val_element_one val_element_two val_element_three ]
:keyBBB [ val_element_four val_element_five val_element_six ]
:keyCCC [ val_element_seven val_element_eight val_element_nine ]}
( :keyAAA :keyBBB :keyCCC )
[ val_element_one
val_element_two
val_element_three
val_element_four
val_element_five
val_element_six
val_element_seven
val_element_eight
val_element_nine ]
基本上,我在对象的每个键/val上寻找(甚至更好)类型功能。非常感谢您提供的帮助。我们可以按如下方式处理您的具体问题:
(def data
'{
:keyAAA [ val_element_one val_element_two val_element_three ]
:keyBBB [ val_element_four val_element_five val_element_six ]
:keyCCC [ val_element_seven val_element_eight val_element_nine ]
})
(->> data
vals
(apply concat)
vec)
;[val_element_one val_element_two val_element_three val_element_four val_element_five val_element_six val_element_seven val_element_eight val_element_nine]
但我怀疑你脑子里有更复杂的想法。在这种情况下,您可能会发现上的函数非常有用。这些工具从地图生成地图
如果您正在寻找像
doseq
这样的东西,它的作用不仅仅是副作用,那么您可能正在寻找for
我们可以按如下方式处理您的具体问题:
(def data
'{
:keyAAA [ val_element_one val_element_two val_element_three ]
:keyBBB [ val_element_four val_element_five val_element_six ]
:keyCCC [ val_element_seven val_element_eight val_element_nine ]
})
(->> data
vals
(apply concat)
vec)
;[val_element_one val_element_two val_element_three val_element_four val_element_five val_element_six val_element_seven val_element_eight val_element_nine]
但我怀疑你脑子里有更复杂的想法。在这种情况下,您可能会发现上的函数非常有用。这些工具从地图生成地图
如果您正在寻找像
doseq
这样的东西,它的作用不仅仅是副作用,那么您可能正在寻找for
因为接受的答案已经提供了经典的方式来做你要问的,考虑这些替代方法,使用更多的现代语言特征建立在传感器周围。
concat
的每一步延迟序列开销:
(into-array (eduction cat (vals your-map)))
(apply concat (vals <your-map>))
(into [] cat (vals your-map))
comp
它们即可。g
(into [] (comp cat (filter pos?)) (vals your-map)) ; just the positive elements
最后,如果您意识到以后确实需要懒惰,那么不需要重写任何代码就可以很容易地恢复懒惰:
(sequence (comp cat (filter pos?)) (vals your-map))
;; now it's up to the consumer of your collection how many
;; elements will be calculated
既然接受的答案已经提供了经典的方式来做你要问的,考虑这些替代方法,使用更多的现代语言特征建立在传感器周围。
concat
的每一步延迟序列开销:
(into-array (eduction cat (vals your-map)))
(apply concat (vals <your-map>))
(into [] cat (vals your-map))
comp
它们即可。g
(into [] (comp cat (filter pos?)) (vals your-map)) ; just the positive elements
最后,如果您意识到以后确实需要懒惰,那么不需要重写任何代码就可以很容易地恢复懒惰:
(sequence (comp cat (filter pos?)) (vals your-map))
;; now it's up to the consumer of your collection how many
;; elements will be calculated
如果您真正想做的只是将映射中的值串联起来,那么只需使用
vals
和concat
:
(into-array (eduction cat (vals your-map)))
(apply concat (vals <your-map>))
如果您真正想做的只是将映射中的值串联起来,那么只需使用
vals
和concat
:
(into-array (eduction cat (vals your-map)))
(apply concat (vals <your-map>))
谢谢@缩略图,我想我找到了我需要的减少KV<代码>(VEC(MAPCAT第二数据))谢谢@缩略图,我想我找到了我需要的减少KV<代码>(VEC(MAPCAT第二数据))< /代码>我建议你学习并考虑接受而不是我的。我不会生气的:)我建议你学习并考虑接受而不是我的。我不会生气的:),