我想更新哈希值,但我不确定如何有效地完成这项工作
我尝试使用循环方法,但同时保留之前记录的值似乎是一个很大的挑战。
这就是我想要做的,
考虑到记录是按降序排列的created_at排序的,例如,
[{:id 1, :created_at "2016-08-30 11:07:00"}{:id 2, :created_at "2016-08-30 11:05:00"}...]
] ;基本上是人性化的形式。
有人可以分享一些想法来实现这一目标吗?提前致谢。
答案 0 :(得分:1)
简化示例:
(def data [{:value 10} {:value 8} {:value 3}])
(conj
(mapv
(fn [[m1 m2]] (assoc m1 :difference (- (:value m1) (:value m2))))
(partition 2 1 data))
(last data))
;;=> [{:value 10, :difference 2} {:value 8, :difference 5} {:value 3}]
答案 1 :(得分:0)
你需要的是迭代所有连续记录对,保留它们中的第一个,增加差异。
日期处理的第一个实用函数:
(defn parse-date [date-str]
(.parse (java.text.SimpleDateFormat. "yyyy-MM-dd HH:mm:ss") date-str))
(defn dates-diff [date-str1 date-str2]
(- (.getTime (parse-date date-str1))
(.getTime (parse-date date-str2))))
然后是映射部分:
user> (def data [{:id 1, :created_at "2016-08-30 11:07:00"}
{:id 2, :created_at "2016-08-30 11:05:00"}
{:id 3, :created_at "2016-08-30 10:25:00"}])
user> (map (fn [[rec1 rec2]]
(assoc rec1 :difference
(dates-diff (:created_at rec1)
(:created_at rec2))))
(partition 2 1 data))
({:id 1, :created_at "2016-08-30 11:07:00", :difference 120000}
{:id2, :created_at "2016-08-30 11:05:00", :difference 2400000})
注意它不包含最后一项,因为它从不是一对中的第一项。所以你必须手动添加它:
user> (conj (mapv (fn [[rec1 rec2]]
(assoc rec1 :difference
(dates-diff (:created_at rec1)
(:created_at rec2))))
(partition 2 1 data))
(assoc (last data) :difference ""))
[{:id 1, :created_at "2016-08-30 11:07:00", :difference 120000}
{:id 2, :created_at "2016-08-30 11:05:00", :difference 2400000}
{:id 3, :created_at "2016-08-30 10:25:00", :difference ""}]
现在没关系。与您想要的变体的唯一区别在于差异是以毫秒为单位,而不是格式化的字符串。为此,您可以将格式添加到dates-diff
功能。