成为Elixir和函数式编程的新手,我有一些问题需要获取"品味"这个结构的关键。
json = response.body
icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]})
Returns:
[%{"items" => [%MyModule.Icecream{size: "Large",
taste: "Pistachio"}]}]
我只想以最优化的方式将品味(" Pistachio")保存到变量中。
我期待着开悟。 :)
解决方案: 我自己想出了这个:
taste = List.first(icecream["items"]).taste
答案 0 :(得分:2)
使用管道,你可以
icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste)
但是,我建议您将get_in/2
与Access
helpers结合使用,IMO会产生非常易读的代码,对于更复杂的案例来说似乎更好。
import Access
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)]
答案 1 :(得分:0)
您还可以使用简单的模式匹配:
[%{"items" => [%{taste: taste_val}]}] = your_result
它将taste
值保存到变量taste_val
中。如果您的结果没有taste
,那么当您使用nil
模块定义结构时,它将设置为defstruct
(或您的默认值)。
答案 2 :(得分:0)
您还可以使用Map.get
或Map.fetch
见:https://hexdocs.pm/elixir/Map.html#fetch/2)
请记住,如果您正在使用
Map.fetch!(map,key)
map
中的密钥不存在时,可能会导致副作用(抛出错误)。如果您使用的是Map.fetch(map,key)
,则会返回一个 ok 或错误状态的元组,表示key
中map
的可用性}。