Получение значения вложенной карты в эрланге - PullRequest
3 голосов
/ 12 марта 2020

У меня есть вложенная карта в erlang, и я не могу понять, как правильно получить значение ключа из нее.

A = #{"key1" => "val1", "key2" => #{"key3"=>"val3", "key4" => #{"key5" => "val5"}}},

Я хочу извлечь значение key5 и так далеко я пробовал это.

    A = #{"key1" => "val1", "key2" => #{"key3"=>"val3", "key4" => #{"key5" => "val5"}}},
    S = maps:get("key2", A),
    SS = maps:get("key4", S),
    Val = maps:get("key5", SS),
    Val.

Я знаю, что это работает, но я уверен, что есть лучший способ сделать это!

Ответы [ 2 ]

3 голосов
/ 12 марта 2020

Вы можете использовать сопоставление с образцом, чтобы извлечь значение key5:

A = #{"key1" => "val1", "key2" => #{"key3" => "val3", "key4" => #{"key5" => "val5"}}},
#{"key2" := #{"key4" := #{"key5" := Value}}} = A,
Value.
0 голосов
/ 13 марта 2020

Вы можете попробовать создать рекурсивную функцию, например:

-module(nm).

-export([nested_map/0]).

-define(KEY, "key5").

nested_map() ->
  Map =   #{"key1" => "val1", "key2" => #{"key3"=>"val3", "key4" => #{"key5" => "val5"}}},
  get_val(maps:keys(Map), Map, ?KEY).

get_val([], _, _) ->
  undefined;
get_val(_, #{?KEY := Val}, ?KEY) ->
  Val;
get_val([H|T], Map, Key) ->
  case is_map(maps:get(H, Map)) of
    true -> 
      NewMap = maps:get(H, Map),
      get_val(maps:keys(NewMap), NewMap, Key);
    false ->
      get_val(T, Map, Key)
  end.

В оболочке:

1> c(nm).
{ok,nm}
2> nm:nested_map().
"val5"
3> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...