首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >灵丹妙药:将具有相同地图键的合并列表合并到一个地图

灵丹妙药:将具有相同地图键的合并列表合并到一个地图
EN

Stack Overflow用户
提问于 2017-10-01 23:02:06
回答 3查看 2.3K关注 0票数 3

如何将此列表转换为长生不老药?

代码语言:javascript
复制
[
%{key1: 1, key2: 2, key3: 3},
%{key1: 4, key2: 5, key3: 6},
%{key1: 7, key2: 8, key3: 9}
]

到这张地图上

代码语言:javascript
复制
%{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9])
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-10-02 05:37:30

代码语言:javascript
复制
Enum.reduce(input, %{key1: [], key2: [], key3: []}, fn m, acc ->
  Map.merge(acc, m, fn _k, v1, v2 -> v1 ++ [v2] end)
end)
#⇒ %{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9]}

或者,如果没有初步的硬编码累加器:

代码语言:javascript
复制
Enum.reduce(input, %{}, fn m, acc ->
  Map.merge(acc, m, fn
    _k, v1, v2 when is_list(v1) ->
      :lists.reverse([v2 | :lists.reverse(v1)])
    _k, v1, v2 -> [v1, v2]
  end)
end)
#⇒ %{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9]}
票数 6
EN

Stack Overflow用户

发布于 2017-10-02 01:39:29

您可以在两次传递中完成这一任务;第一次将所有内容简化为一个一维的键值对列表,然后第二次按键传递组。

代码语言:javascript
复制
input = [
  %{key1: 1, key2: 2, key3: 3},
  %{key1: 4, key2: 5, key3: 6},
  %{key1: 7, key2: 8, key3: 9}
]

input
|> Enum.flat_map(fn m -> Map.to_list(m) end) 
|> Enum.group_by(fn {k, _} -> k end, fn {_, v} -> v end) 

输出

代码语言:javascript
复制
%{key1: [1, 4, 7], key2: [2, 5, 8], key3: [3, 6, 9]}
票数 8
EN

Stack Overflow用户

发布于 2017-10-02 00:15:21

我还不太擅长灵丹妙药,但我想出了以下几点:

代码语言:javascript
复制
map = Enum.reduce(list, %{}, fn(inner_map, acc) ->
        Map.merge(acc, inner_map, fn(_, v1, v2) ->
          if is_list(v1) do
            v1 ++ [v2]
          else
            [v1] ++ [v2]
          end
        end)
      end)

但我想一定有更好的方法

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46517703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档