我有一个嵌套模型,想要做一些基本的管道。我的最终目标是删除id == ""
以下参数的任何嵌套地图:
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变成了一个数组,因此我需要将该数组转换回结构。
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 :(得分: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)
阅读更详细的说明