Functional programming Elixir从json/struct获取键/值对
作为Elixir和函数式编程的新手,我在从这个结构获取“taste”键时遇到了一些问题Functional programming Elixir从json/struct获取键/值对,functional-programming,elixir,Functional Programming,Elixir,作为Elixir和函数式编程的新手,我在从这个结构获取“taste”键时遇到了一些问题 json = response.body icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]}) Returns: [%{"items" => [%MyModule.Icecream{size: "Large", taste: "Pistachio"}]}] 我只想以最优化的方式将味道(“开心果”)保存到变量中 我期待
json = response.body
icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]})
Returns:
[%{"items" => [%MyModule.Icecream{size: "Large",
taste: "Pistachio"}]}]
我只想以最优化的方式将味道(“开心果”)保存到变量中
我期待得到启发。:)
解决方案:
我自己想出来的:
taste = List.first(icecream["items"]).taste
使用管道,您可以
icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste)
但是,我建议您结合使用,IMO会产生非常可读的代码,并且对于更复杂的情况似乎更好
import Access
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)]
使用管道,您可以
icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste)
但是,我建议您结合使用,IMO会产生非常可读的代码,并且对于更复杂的情况似乎更好
import Access
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)]
您还可以使用简单的模式匹配:
[%{"items" => [%{taste: taste_val}]}] = your_result
它将
taste
值保存到变量taste\u val
中。如果您的结果没有味道
,当您使用模块定义结构时,它将被设置为nil
(或您的默认值)。您还可以使用简单的模式匹配:
[%{"items" => [%{taste: taste_val}]}] = your_result
它将
taste
值保存到变量taste\u val
中。如果您的结果没有味道
,当您使用模块定义结构时,它将被设置为nil
(或您的默认值)。您也可以使用Map.get
或Map.fetch
见:)
请记住,如果您正在使用
Map.fetch!(地图、钥匙)
当键不在
map
中时,可能会导致副作用(引发错误)。如果您正在使用Map.fetch(Map,key)
您将返回一个状态为ok或error的元组,表示Map
中的key
可用,您也可以使用Map.get
或Map.fetch
见:)
请记住,如果您正在使用
Map.fetch!(地图、钥匙)
当键不在
map
中时,可能会导致副作用(引发错误)。如果您使用的是Map.fetch(Map,key)
您将返回一个状态为ok或error的元组,表示Map
中的key
可用,谢谢您的回答。但是,我在第二个解决方案中遇到了一个编译器错误:未定义的函数位于/1Did youimport Access
?如果您担心名称空间混乱,也可以在单个函数的本地执行该操作。@PatrickOscity是否仅在Elixir的某些版本中可用?也许Zahrec正在使用一种旧版本的长生不老药?@OnorioCatenacci很好!似乎这是在1.3中添加的。我正在运行Elixir版本1.3.4感谢您的回答。但是,我在第二个解决方案中遇到了一个编译器错误:未定义的函数位于/1Did youimport Access
?如果您担心名称空间混乱,也可以在单个函数的本地执行该操作。@PatrickOscity是否仅在Elixir的某些版本中可用?也许Zahrec正在使用一种旧版本的长生不老药?@OnorioCatenacci很好!似乎这是在1.3中添加的。我正在运行Elixir 1.3.4版。您应该选择的方法将取决于您希望边缘案例的方式。当元素不存在时,您希望发生什么(如果您愿意处理该情况)?您希望它引发异常还是返回nil?还有什么?我希望它总是在那里,但我同意检查一下会更好。您应该选择的方法将取决于您希望边缘案例的方式。当元素不存在时,您希望发生什么(如果您愿意处理该情况)?您希望它引发异常还是返回nil?还有别的吗?我希望它总是在那里,但我同意如果能检查一下会更好。