【问题标题】:Extract value from list of hash-maps Clojure从哈希映射列表中提取值 Clojure
【发布时间】:2016-01-28 12:44:46
【问题描述】:

我目前正在尝试从哈希映射列表中获取一个值。

  (def cards
  (hash-map
    :card1 {:name "Wisp" :damage 1 :health 1 :cost 0}
    :card2 {:name "Spider Tank" :damage 3 :health 4 :cost 3}
  )

我的“卡片”有一个哈希映射。

(def deck1
      (list (get cards :card1) (get cards :card2) (get cards :card1))

还有一个包含这些卡片列表的套牌。 (我已经缩短了两个结构)

我正在尝试做的是通过传递卡片名称来搜索此套牌结构以查找卡片。此卡作为 var 保存并传递到其他地方。然后,我将在没有这张卡的情况下重建列表。

所以,我正在尝试从套牌中的任何位置抽一张特定的牌。

目前我只是想拿到卡,但我在代码上遇到了死胡同。

(defn playCard [card]
(let [c first deck1 (get-in deck1 [card :name]))]
    (println "LOOK AT ME" c)))

任何帮助将不胜感激。

【问题讨论】:

  • 您说您要在deck1 中搜索具有特定:name 的卡?那为什么playCard 输入的是卡片而不是卡片名称呢?假设您要求的是如何实现playCard,您能否更具体地记录playCard 应该做什么?

标签: list clojure hashmap


【解决方案1】:

以下是如何取回您的卡片的示例。我还重构了声明:

(def cards {:card1 {:health 1, :name "Wisp", :damage 1, :cost 0}, 
            :card2 {:health 4, :name "Spider Tank", :damage 3, :cost 3}})

(def deck [(:card1 cards)
           (:card2 cards)
           (:card1 cards)])

(defn find-first
     [f coll]
     (first (filter f coll)))

(find-first #(= (:name %) "Wisp") deck) ;; => {:health 1, :name "Wisp", :damage 1, :cost 0}

这是假设您想按名称查找卡片(查找您已经拥有的卡片没有意义)。

【讨论】:

  • 如果我想从另一个函数调用 find-first ,我需要进行任何更改吗?我目前收到“不知道如何从 clojure.lang.Atom 创建 ISeq”。在我的函数中,我的甲板被定义为一个原子。
  • find-first 接受两个参数:一个函数和一个集合。大概你没有传递一个集合作为第二个参数,而是一个原子。也许尝试先用 a 取消引用它:(find-first same-fn @your-atom)
  • 谢谢,查看了 @ 并且该功能现在可以按预期工作。抱歉,最后一个问题,您能否指出一个表达式/函数,我可以利用该表达式/函数在没有找到的元素的情况下重新创建该列表。
  • 有很多方法可以做到这一点。首先,熟悉filter。例如,另请参阅 stackoverflow.com/questions/939278/…stackoverflow.com/questions/1394991/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2017-12-18
  • 1970-01-01
相关资源
最近更新 更多