2016-08-30 3 views
0

の配列に私はハッシュの値を更新したいと思いますが、私はこれは私がループアプローチを使用してみましたが、前のレコードの値を保ち、効率的のClojure - 更新データ値のハッシュ

を行うことができるかどうかはわかりませんまた、アカウント内では大きなチャレンジのように思えます。

この

は私がやろうとしています、レコードを考慮

は、

[{:id 1, :created_at "2016-08-30 11:07:00"}{:id 2, :created_at "2016-08-30 11:05:00"}...] 

] 例えば、降順でのcreated_atに基づいてソートされているものです。基本的にはヒト化された形で。

誰でもこれを達成するためのアイデアを共有できますか?前もって感謝します。

答えて

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 ""}] 

今は問題ありません。あなたの希望するバリアントとの唯一の違いは、diffがフォーマットされた文字列ではなく、ミリ秒であることです。これを行うには、dates-diff関数に書式を追加します。

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}]