【发布时间】:2015-11-16 20:58:21
【问题描述】:
我有一个嵌套模型并想做一些基本的管道。我的最终目标是删除任何嵌套地图,其中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", %{"id" => "2"}}, {"1", %{"id" => "3"}}]表示一个列表,而不是一个数组;差异并非微不足道。