2015-10-06 127 views
1

我有一個嵌套模型,並希望做一些基本的管道。我的最終目標是消除任何嵌套的地圖,id == ""爲以下PARAMS:elixir管道,如果新變量可以管道,如果直接向管道發送不能管道,爲什麼?

params = %{"name" => "OuterModelName", "InnerModel" => %{"0" => %{"id" => "2"}, "1" => %{"id" => "3"}, "2" => %{"id" => ""}}}

要刪除id ==""以下管道工程:

blanksRemoved = 
     params 
     |> Map.update! "InnerModel", fn(innerMap) -> 
      Enum.filter(innerMap,fn{k,v} -> byte_size(v["id"]) !=0 end) end 

blanksRemoved現在是:

%{"name" => "OuterModelName", "InnerModel" => [{"0", %{"id" => "2"}}, {"1", %{"id" => "3"}}]}

注意innerModel成爲一個數組,所以我需要d將該數組轉換回結構。

asStruct = 
     blanksRemoved |> Map.update! "InnerModel", fn(innerMap) -> 
      Enum.into(innerMap,%{}) end 

這按預期工作,我得到:

%{"name" => "OuterModelName", "InnerModel" => %{"0" => %{"id" => "2"}, "1" => %{"id" => "3"}}}

然而,當我試圖簡單地將兩個管道與管道下方結合,我得到一個錯誤。

combinedPipes = 
     params 
     |> Map.update! "InnerModel", fn(innerMap) -> 
      Enum.filter(innerMap,fn{k,v} -> byte_size(v["id"]) !=0 end) end 
     |> Map.update! "InnerModel", fn(innerMap) -> 
      Enum.into(innerMap,%{}) end 

和錯誤:

argument error 
    (stdlib) :maps.find("InnerModel", #Function<2.64012156 

我知道錯誤是因爲它無法找到「InnerModel」,但我不知道爲什麼它不能發現,當它工作時,我分開管道。有人能告訴我這裏發生了什麼事嗎?

+0

更詳細的解釋記住,'[{ 「0」 時,%{ 「ID」=> 「2」}},{ 「1」,%{ 「id」=>「3」}}]'表示一個列表,而不是一個數組;差別不是微不足道的。 –

回答

5

編輯在Elixir的主分支上,編譯器會警告函數是否在沒有括號的情況下被傳入,如果有參數的話。


由於函數調用的優先級高於管道運算符,因此您需要在函數調用周圍使用明確的括號。

combinedPipes = 
     params 
     |> Map.update!("InnerModel", fn(innerMap) -> 
      Enum.filter(innerMap,fn{k,v} -> byte_size(v["id"]) !=0 end) end) 
     |> Map.update!("InnerModel", fn(innerMap) -> 
      Enum.into(innerMap,%{}) end) 

可以讀取在Why Can't I Chain String.replace?

+0

謝謝!我知道這是小東西,所以我不得不問:) –

+0

這是另一個藥劑常見問題。 :) –