如何遍历列表中的映射,并将它们的值存储到变量
How to iterate through maps in list, and store their values to variable
我是 erlang 的新手,我正在尝试做这样的事情:
有一个地图列表,例如:
List = [#{id => 1, start=> 'Y', memberName => "MemberName" },
#{id => 2, start=> 'N', memberName => "MemberName" }],
已编辑
然后我想遍历列表中的每个映射并将 memberName
和 id
的每个值存储到一个单独的变量中。
如何实现这样的目标?
您可以使用 fold。
> List = [#{id => 1, start=> 'Y', memberName => "MemberName" },
#{id => 2, start=> 'N', memberName => "MemberName" }],
> lists:foldl(fun(Elem, AccIn) -> lists:append([maps:get(memberName, Elem)], AccIn) end, [], List).
["MemberName","MemberName"]
在这种情况下,您还可以使用列表理解和模式处理:
1> List = [#{id => 1, start=> 'Y', memberName => "MemberName1" },#{id => 2, start=> 'N', memberName => "MemberName2" }],
2> [X || #{memberName := X} <- List].
["MemberName1","MemberName2"]
3>
请注意,与@2240 解决方案相比的主要行为差异在于,如果列表包含不同的元素,它不会失败。我不知道你对这种情况的期望是什么。
3> L2 = List ++ [atom,#{nomembername => no}].
[#{id => 1,memberName => "MemberName1",start => 'Y'},
#{id => 2,memberName => "MemberName2",start => 'N'},
atom,
#{nomembername => no}]
4> [X || #{memberName := X} <- L2].
["MemberName1","MemberName2"]
5> lists:foldl(fun(Elem, AccIn) -> lists:append([maps:get(memberName, Elem)], AccIn) end, [], List).
["MemberName2","MemberName1"]
6> lists:foldl(fun(Elem, AccIn) -> lists:append([maps:get(memberName, Elem)], AccIn) end, [], L2).
** exception error: {badmap,atom}
in function maps:get/2
called as maps:get(memberName,atom)
in call from erl_eval:do_apply/6 (erl_eval.erl, line 684)
in call from erl_eval:expr/5 (erl_eval.erl, line 232)
in call from erl_eval:expr_list/6 (erl_eval.erl, line 888)
in call from erl_eval:expr/5 (erl_eval.erl, line 411)
in call from lists:foldl/3 (lists.erl, line 1263)
7>
[编辑]
我不确定你想做什么。在 erlang 中,列表是一种非常基本的结构,用于排序“多个”结果。然后,您可以使用众多列表迭代器之一处理其元素:foreach、map、foldl、foldr、mapfoldl、mapfoldr 或构建您自己的递归函数。
为了在您的方向上走得更远,有 2 种情况,具体取决于您的初始列表在编写和编译应用程序时已知的固定长度。
如果是,这似乎不太可能,您可以简单地将结果列表与变量列表匹配,如以下代码所示:
8> [Name1,Name2] = [X || #{memberName := X} <- List].
["MemberName1","MemberName2"]
9> Name1.
"MemberName1"
10> Name2.
"MemberName2"
11>
如果列表的长度可能不同或未知,则无法将每个名称分配给单个变量。您必须将结果分配给一个名称列表,然后使用该列表,或者遍历初始地图列表并一次处理一个名称。下面是一个使用列表的例子:foreach/2:
Names = [X || #{memberName := X} <- List],
lists:foreach(fun(X) -> do_something(X) end,Names),
...
or
lists:foreach(fun(#{memberName := X}) -> do_something(X) end,List),
...
我是 erlang 的新手,我正在尝试做这样的事情:
有一个地图列表,例如:
List = [#{id => 1, start=> 'Y', memberName => "MemberName" },
#{id => 2, start=> 'N', memberName => "MemberName" }],
已编辑
然后我想遍历列表中的每个映射并将 memberName
和 id
的每个值存储到一个单独的变量中。
如何实现这样的目标?
您可以使用 fold。
> List = [#{id => 1, start=> 'Y', memberName => "MemberName" },
#{id => 2, start=> 'N', memberName => "MemberName" }],
> lists:foldl(fun(Elem, AccIn) -> lists:append([maps:get(memberName, Elem)], AccIn) end, [], List).
["MemberName","MemberName"]
在这种情况下,您还可以使用列表理解和模式处理:
1> List = [#{id => 1, start=> 'Y', memberName => "MemberName1" },#{id => 2, start=> 'N', memberName => "MemberName2" }],
2> [X || #{memberName := X} <- List].
["MemberName1","MemberName2"]
3>
请注意,与@2240 解决方案相比的主要行为差异在于,如果列表包含不同的元素,它不会失败。我不知道你对这种情况的期望是什么。
3> L2 = List ++ [atom,#{nomembername => no}].
[#{id => 1,memberName => "MemberName1",start => 'Y'},
#{id => 2,memberName => "MemberName2",start => 'N'},
atom,
#{nomembername => no}]
4> [X || #{memberName := X} <- L2].
["MemberName1","MemberName2"]
5> lists:foldl(fun(Elem, AccIn) -> lists:append([maps:get(memberName, Elem)], AccIn) end, [], List).
["MemberName2","MemberName1"]
6> lists:foldl(fun(Elem, AccIn) -> lists:append([maps:get(memberName, Elem)], AccIn) end, [], L2).
** exception error: {badmap,atom}
in function maps:get/2
called as maps:get(memberName,atom)
in call from erl_eval:do_apply/6 (erl_eval.erl, line 684)
in call from erl_eval:expr/5 (erl_eval.erl, line 232)
in call from erl_eval:expr_list/6 (erl_eval.erl, line 888)
in call from erl_eval:expr/5 (erl_eval.erl, line 411)
in call from lists:foldl/3 (lists.erl, line 1263)
7>
[编辑]
我不确定你想做什么。在 erlang 中,列表是一种非常基本的结构,用于排序“多个”结果。然后,您可以使用众多列表迭代器之一处理其元素:foreach、map、foldl、foldr、mapfoldl、mapfoldr 或构建您自己的递归函数。
为了在您的方向上走得更远,有 2 种情况,具体取决于您的初始列表在编写和编译应用程序时已知的固定长度。
如果是,这似乎不太可能,您可以简单地将结果列表与变量列表匹配,如以下代码所示:
8> [Name1,Name2] = [X || #{memberName := X} <- List].
["MemberName1","MemberName2"]
9> Name1.
"MemberName1"
10> Name2.
"MemberName2"
11>
如果列表的长度可能不同或未知,则无法将每个名称分配给单个变量。您必须将结果分配给一个名称列表,然后使用该列表,或者遍历初始地图列表并一次处理一个名称。下面是一个使用列表的例子:foreach/2:
Names = [X || #{memberName := X} <- List],
lists:foreach(fun(X) -> do_something(X) end,Names),
...
or
lists:foreach(fun(#{memberName := X}) -> do_something(X) end,List),
...