获取Erlang中嵌套Map的值

1u4esq0p  于 2022-12-08  发布在  Erlang
关注(0)|答案(3)|浏览(231)

我有一个用Erlang编写的嵌套Map,我不知道如何正确地从它得到一个键的值。

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.

我知道这是工作,但我很肯定有一个更好的方法来做它!

qacovj5a

qacovj5a1#

您可以使用模式匹配来提取key5的值:

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

zzzyeukh2#

你可以试着创建递归函数,例如:

-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.

在shell中:

1> c(nm).
{ok,nm}
2> nm:nested_map().
"val5"
3>
tyu7yeag

tyu7yeag3#

大概专门的图书馆可以作为解决这个任务的有心人:
https://github.com/Shaienn/nested_maps

相关问题