【问题标题】:Clojure iteration, modification and operation on nested valuesClojure 对嵌套值的迭代、修改和操作
【发布时间】:2017-05-26 05:11:24
【问题描述】:

我有一些看起来像这样的数据:

{2007-08-09 [{ :steaks 10 }, { :shakes  30 }, { :iced-tea 50 }],
 2007-08-10 [{ :steaks 15 }, { :shakes  09 }, { :iced-tea 57 }]}

我正在尝试遍历这些数据,对每个哈希求和,然后添加一个包含该总和的新哈希,所以它看起来像这样:

{2007-08-09 [{ :steaks 10 }, { :shakes  30 }, { :iced-tea 50 }, {:total-orders 90}],
 2007-08-10 [{ :steaks 15 }, { :shakes  09 }, { :iced-tea 57 }, {:total-orders 81}]}

问题是:我完全迷失了。当我尝试使用 doseqma​​p 迭代数据时,它不会返回类似

[{ :steaks 10 }, { :shakes 30 }, { :iced-tea 50 }]

所以我可以添加这些哈希值,它返回的值与以前完全相同。 即使是这样,我也不知道附加包含总订单的新哈希的最佳方法是什么。覆盖变量是一个好习惯吗?或者有更好的方法吗?非常感谢。

【问题讨论】:

    标签: clojure


    【解决方案1】:

    所以,稍微清理一下你的数据结构,你就会得到

    (def orders {"2007-08-09" [{ :steaks 10 }, { :shakes  30 }, { :iced-tea 50 }],
     "2007-08-10" [{ :steaks 15 }, { :shakes  09 }, { :iced-tea 57 }]})
    

    我不知道您为什么选择将订单作为单独的哈希映射而不是哈希映射

    (def orders {"2007-08-09" {:steaks 10 :shakes  30 :iced-tea 50 },
     "2007-08-10" {:steaks 15 :shakes  09 :iced-tea 57 }})
    

    所以,你想要一天的总数,这是由(使用你的数据结构)完成的

    (def orders-pr-day [{ :steaks 10 }, { :shakes  30 }, { :iced-tea 50 }])
    
     (->> orders-pr-day 
         (into {})   ;; I want it as a hash map
         vals        ;; pull out the values e.g. 10, 30 50
         (reduce +)) ;; sum it up
    

    然后你可以创建一个函数来总结给定的一天并添加总数:

    (defn sum-day [[date orders-pr-day]] ; we can restructure a map-entry 
      [date (conj orders-pr-day {:total (->> orders-pr-day
                                        (into {})
                                        vals
                                        (reduce +))})])
    

    最后,您映射您的数据并将其粘贴到地图中

    (into {} (map sum-day orders))
    

    这也概述了我解决这个问题的方法。首先解决一件事的计算,然后编写你的方法来获得一个完整的解决方案。 有人可能会说

    (->> orders-pr-day (into {}) vals (reduce +))
    

    不愧是函数,但是YMMV。

    【讨论】:

    • 非常感谢先生!但我还有一个问题,我怎样才能从中提取:(def orders [{ :steaks 10 }, { :shakes 30 }, { :iced-tea 50 }]):(def orders {"2007-08- 09" [{ :steaks 10 }, { :shakes 30 }, { :iced-tea 50 }], "2007-08-10" [{ :steaks 15 }, { :shakes 09 }, { :iced-tea 57 }]})
    • 我重新措辞以表明它们是不同的东西。所以,orders-pr-day 只是我从你的orders 复制粘贴的东西,好吧,为了在总结总数时只做一件事。
    • 我注意到了,谢谢 :) 但是如果你不介意,你能告诉我如何迭代订单变量,以便我可以从中提取每天的订单吗?
    • (vals orders) ?
    猜你喜欢
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2012-07-19
    • 1970-01-01
    • 2020-01-05
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多