【问题标题】:How to get the sequence of keys for each map in a list of maps in Clojure?如何在 Clojure 的地图列表中获取每个地图的键序列?
【发布时间】:2014-07-07 05:45:47
【问题描述】:

所以我有以下尝试在地图列表上进行映射,并且我试图获取“keys”函数在我传递单个地图时返回的键序列。

(map #(keys %) ({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}))

返回给我一个

java.lang.ClassCastException: null

我想这与键的返回类型是一个序列有关,通过映射我猜它期待一个映射返回值???我真的不确定它为什么会这样

(keys {:a-id 1 :b 3 :c 2})

即——(:a-id :b :c)

【问题讨论】:

    标签: map clojure key


    【解决方案1】:
    (map keys '({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}))
    

    【讨论】:

      【解决方案2】:
      ({:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2})
      

      是函数调用而不是列表。您应该使用列表或向量或引用表​​达式:

      (list{:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2})
      

      【讨论】:

        【解决方案3】:

        除非你真的想创建一个函数调用,否则最好不要使用列表。您的原始代码,转换为 3 个地图的矢量,效果很好:

        user=> (map #(keys %) [{:a-id 1 :b 3 :c 2} {:d-id 3 :e 9 :c 1} {:a-id 3 :d-id 5 :c 2}] )
        ((:a-id :c :b) (:e :c :d-id) (:a-id :c :d-id))
        

        我们保留外括号,因为 (map ...) 旨在作为函数调用。我们将内部列表更改为向量,因为这强调它是数据(而不是函数调用)。引用列表也有效,但不必要地复杂。就像在说“我正在进行函数调用,但不要将其评估为函数调用。”

        【讨论】:

          猜你喜欢
          • 2016-05-23
          • 1970-01-01
          • 2022-08-16
          • 2014-03-13
          • 2017-09-10
          • 2018-05-09
          • 1970-01-01
          • 2020-05-27
          • 1970-01-01
          相关资源
          最近更新 更多