2016-12-12 7 views
0

エリクシールと関数型プログラミングに新しいので、私はこの構造体から "味"キーをフェッチするいくつかの問題があります。json/structからのエリクシールフェッチのキー/値のペア

json = response.body 
icecream = Poison.decode!(json, as: %{"items" => [%Icecream{}]}) 

Returns: 
[%{"items" => [%MyModule.Icecream{size: "Large", 
taste: "Pistachio"}]}] 

味(「ピスタチオ」)を変数に保存するのは、最も最適化された方法です。

私は啓発されることを楽しみにしています。 :)

ソリューション: が、私はこれで自分自身を思い付いた:パイプを使用して

taste = List.first(icecream["items"]).taste 
+0

あなたが選ぶべきアプローチは、エッジケースをどのようにしたいかによって異なります。要素が存在しないときに何が起こりたいのですか(そのケースを扱うのが気になる場合)?例外を発生させたり、nilを返すのが好きですか?他に何か? –

+0

私はそれがいつもそこにあることを期待していますが、私はそれをチェックすることでより良いことに同意します。 – Zahrec

答えて

2

は、あなたがしかし

icecream |> hd |> Map.get("items") |> hd |> Map.get(:taste) 

行うことができ、私はあなたがIMO Access helpers、と一緒にget_in/2を使用することをお勧め非常に読みやすいコードとなり、より複雑なケースではより良いように見えます。

import Access 
get_in icecream, [at(0), key!("items"), at(0), key!(:taste)] 
+0

あなたの答えをありがとう。 2番目のソリューションでコンパイラエラーが発生する:/ 1で未定義の関数 – Zahrec

+0

'アクセスをインポートしましたか? 'また、ネームスペースが乱雑になることが懸念される場合は、単一の関数に対してローカルで行うこともできます。 –

+1

@PatrickOscityそれはElixirの特定のバージョンでのみ利用できますか?多分ZahrecはElixirの古いバージョンで作業していますか? –

0

また、単純なパターンマッチングを使用することができます。

[%{"items" => [%{taste: taste_val}]}] = your_result 

それは変数taste_valtaste値を保存します。結果にtasteが含まれていない場合は、defstructというモジュールを使用して構造を定義するときに、nil(またはデフォルト値)に設定されます。あなたは

Map.fetch!(map,key)

を使用している場合ときのキーあなたは(エラーがスロー)の副作用を引き起こす可能性があり、心の中でhttps://hexdocs.pm/elixir/Map.html#fetch/2

ベア:

0

またMap.getまたはMap.fetch 参照を使用することができますmapには存在しません。 Map.fetch(map,key)を使用している場合はokまたはエラーステータスのタプルが返されます。これはkeyの可用性をmapに示します。

関連する問題