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>))
导出是一种收集类型,每次消耗都会产生转换的结果,在这种情况下特别有用,因为它直接减少到一个数组中(通过减少到数组中),并有效地减少自身

  • 如果您不想要数组,而是Clojure向量,那么您仍然可以使用

    (into [] cat (vals your-map))
    
  • 在这里,除了消除每一步的延迟开销外,该实现还在内部使用Clojure瞬态数据结构来加速插入操作

    请注意,这两种方法都允许使用传感器组合进行进一步扩展。您不必了解传感器是如何实现的,就可以了解如何使用它们,只需知道您可以
    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>))
    
  • 导出是一种收集类型,每次消耗都会产生转换的结果,在这种情况下特别有用,因为它直接减少到一个数组中(通过减少到数组中),并有效地减少自身

  • 如果您不想要数组,而是Clojure向量,那么您仍然可以使用

    (into [] cat (vals your-map))
    
  • 在这里,除了消除每一步的延迟开销外,该实现还在内部使用Clojure瞬态数据结构来加速插入操作

    请注意,这两种方法都允许使用传感器组合进行进一步扩展。您不必了解传感器是如何实现的,就可以了解如何使用它们,只需知道您可以
    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第二数据))< /代码>我建议你学习并考虑接受而不是我的。我不会生气的:)我建议你学习并考虑接受而不是我的。我不会生气的:),