首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用assoc-in更新地图中的多个值?(Clojure)

如何使用assoc-in更新地图中的多个值?(Clojure)
EN

Stack Overflow用户
提问于 2018-02-26 19:27:14
回答 4查看 924关注 0票数 1

我试图更新每一行都有一个“享受-关闭?”这会将真正的“理智-评级”返回到-2 (也就是说,约翰尼的理智评级将更新为-2)。

代码语言:javascript
运行
复制
(def student-database
  { 0 {:enjoy-clojure? false, :name "jimmy",:sanity-rating 9}
    1 { :enjoy-clojure? true, :name "johnny",:sanity-rating 2}
    2 { :enjoy-clojure? true, :name "jilly",:sanity-rating 5}
    3 { :enjoy-clojure? true, :name "janey",:sanity-rating 8}
    4 {:enjoy-clojure? false, :name "jelly",:sanity-rating 10}}) 

我是Clojure的新手,我尝试过对update和assoc进行研究,但实际上似乎找不到更新多个元素的方法((assoc student-database [0 :sanity-rating] -2)只返回一个元素)。过滤学生数据库取出返回的学生的真实我有

代码语言:javascript
运行
复制
(defn unhinged?
 [record]
 (:enjoy-clojure? record))

(defn minus-two-students
 [student-database]
 (filter #(unhinged? %)
  (map student-database [0 1 2 3 4])))

和回报

代码语言:javascript
运行
复制
({:enjoy-clojure? true, :name "johnny", :sanity-rating 2} {:enjoy-clojure? 
   true, :name "jilly", :sanity-rating 5} {:enjoy-clojure? true, :name 
   "janey", :sanity-rating 8})

这是很好的工作,但我也需要它来更新他们所有的理智评级为-2。如有任何帮助/建议,将不胜感激。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-02-27 00:07:56

您没有在您的问题中说您希望函数只返回(= enjoy-clojure? true)记录,但是从您在其他答案中的评论中,我觉得这才是您真正想要的。

所以也许这个?

代码语言:javascript
运行
复制
(defn unhinged?
  [record]
  (:enjoy-clojure? record))

(defn minus-two-students
  [student-database]
  (->> student-database
       vals
       (filter unhinged?)
       (map #(assoc % :sanity-rating -2))))

输出将

代码语言:javascript
运行
复制
({:enjoy-clojure? true, :name "johnny", :sanity-rating -2} 
 {:enjoy-clojure? true, :name "jilly", :sanity-rating -2} 
 {:enjoy-clojure? true, :name "janey", :sanity-rating -2})
票数 1
EN

Stack Overflow用户

发布于 2018-02-26 19:40:22

reduce-kv版本来了!

代码语言:javascript
运行
复制
(defn adjust-sanity [student]
  (if (:enjoy-clojure? student)
    (assoc student :sanity-rating -2)
    student))

(reduce-kv (fn [m k v] (assoc m k (adjust-sanity v)))
           {}
           student-database)
=>
{0 {:enjoy-clojure? false, :name "jimmy", :sanity-rating 9},
 1 {:enjoy-clojure? true, :name "johnny", :sanity-rating -2},
 2 {:enjoy-clojure? true, :name "jilly", :sanity-rating -2},
 3 {:enjoy-clojure? true, :name "janey", :sanity-rating -2},
 4 {:enjoy-clojure? false, :name "jelly", :sanity-rating 10}}

或另一个带有帮助函数的选项,用于更新映射的所有值:

代码语言:javascript
运行
复制
(defn update-vals [m f]
  (reduce-kv (fn [m' k v] (assoc m' k (f v))) {} m))
(update-vals student-database adjust-sanity)
票数 2
EN

Stack Overflow用户

发布于 2018-02-26 19:40:54

要更新整个db,可以执行以下操作:

代码语言:javascript
运行
复制
(def student-database
  {0 {:enjoy-clojure? false, :name "jimmy",:sanity-rating 9}
   1 { :enjoy-clojure? true, :name "johnny",:sanity-rating 2}
   2 { :enjoy-clojure? true, :name "jilly",:sanity-rating 5}
   3 { :enjoy-clojure? true, :name "janey",:sanity-rating 8}
   4 {:enjoy-clojure? false, :name "jelly",:sanity-rating 10}})

(defn update-db [db]
  (zipmap (keys db)
          (map (fn [student]
                 (cond-> student
                   (:enjoy-clojure? student)
                   (assoc :sanity-rating -2)))
               (vals db))))

(update-db student-database) ;;=> 
{0 {:enjoy-clojure? false, :name "jimmy", :sanity-rating 9}, 
 1 {:enjoy-clojure? true, :name "johnny", :sanity-rating -2} ...}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48995720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档