2016-09-26 14 views
0

に存在し、私は次のようなデータ構造(地図の二つのベクトルが、私は信じている)同じキーが別のベクトル

{ :put [{:listId "myList", :entryId "1", :dateTime 1434637074}, 
     {:listId "myList", :entryId "2", :dateTime 1434637075}], 
    :delete [{:listId "myList", :entryId "1"}]} 

を持っているとするためのキーlistIdentryId任意の:putエントリを削除したいときのベクトルから地図を削除しますすでに:deleteの中に存在します。したがって、結果は次のようになります。

{ :put [{:listId "myList", :entryId "2", :dateTime 1434637075}], 
    :delete [{:listId "myList", :entryId "1"}]} 

私は次のことを試してみましたが、1)それは慣用Clojureのではないですし、2)それが重複したエントリを削除しません。

(defn remove-add-if-duplicate [requests] 
    (doseq [delete (seq (:delete requests))] 
    (doseq [put (seq (:put requests)) 
      :when (and (= (:listId delete) (:listId put)) 
         (= (:entryId delete) (:entryId put))] 
     (disj (set (:put requests)) put))) 
    requests)) 

(remove-add-if-duplicate 
    { :put [{:listId "myList", :entryId "1", :dateTime 1434637074}, 
      {:listId "myList", :entryId "2", :dateTime 1434637075}], 
    :delete [{:listId "myList", :entryId "1"}]}) 

私のコードを修正したり、これを行ううまくいく方法を教えてもらえますか?

答えて

2
(defn strip [data] 
    (let [ks (-> data :delete set)] 
    (update-in data [:put] #(remove (fn [m] (ks (select-keys m [:listId :entryId]))) %)))) 

とし、...

(def my-stuff { :put [{:listId "myList", :entryId "1", :dateTime 1434637074}, 
     {:listId "myList", :entryId "2", :dateTime 1434637075}], 
    :delete [{:listId "myList", :entryId "1"}]}) 

(def processed { :put [{:listId "myList", :entryId "2", :dateTime 1434637075}], 
    :delete [{:listId "myList", :entryId "1"}]}) 

(= (strip my-stuff) processed); 
;true 

のThある全体のデータ構造に適用するupdate-inを使用して、本質的にMcSokoli's answerと同じであるが、関数として提示

  • 存在について試験するためにセットではなくsomeを使用して、

あなたはClojureののデータ構造が動作する方法を誤解しています。それらを処理する関数はそれらを変更しません。代わりに、変更されたバージョンを返します。

あなたの使用はdoseqです。これはnilを返すので、副作用のみがあり、この場合には何もありません。またそこにあるべきではありません。

:whereとすると、removeという効果が得られますが、それは意味がありません。

1

これは仕事をするはずです。 select-keysを使用すると、と:entryIdのエントリは:putのエントリから、removeのエントリは(:delete input)になります。

(def input {:put [{:listId "myList", :entryId "1", :dateTime 1434637074}, 
        {:listId "myList", :entryId "2", :dateTime 1434637075}], 
      :delete [{:listId "myList", :entryId "1"}]} 


(defn filtered [input] 
    {:delete (:delete input) 
    :put (remove #(some #{(select-keys % [:listId :entryId])} 
       (:delete input))  
     (:put input))}) 

テストそれは、我々はこの取得:

user> (filtered input) 
{:delete [{:listId "myList", :entryId "1"}], 
:put ({:listId "myList", :entryId "2", :dateTime 1434637075})} 

以上のデータ例えば

user> (filtered {:put [{:listId "myList", :entryId "1", :dateTime 1434637074}, 
         {:listId "myList", :entryId "2", :dateTime 1434637075} 
         {:listId "other", :entryId "3", :dateTime 1434637076} 
         {:listId "bestList", :entryId "4", :dateTime 1434637076}], 
       :delete [{:listId "myList", :entryId "1"} 
         {:listId "bestList" :entryId "4"}]}) 
{:delete [{:listId "myList", :entryId "1"} {:listId "bestList", :entryId "4"}], 
:put ({:listId "myList", :entryId "2", :dateTime 1434637075} 
     {:listId "other", :entryId "3", :dateTime 1434637076})} 
関連する問題