【发布时间】:2018-04-27 22:46:48
【问题描述】:
我有 2 个地图列表:
list1 =
[
%{amount: 1, id: 112006},
%{amount: 1, id: 78798},
%{amount: 6, id: 92572},
%{amount: 1, id: 89750},
%{amount: 1, id: 81418},
%{amount: 3, id: 92062},
%{amount: 1, id: 82373},
%{amount: 1, id: 92856}...
]
和
list2 =
[
%{count: 5, id: [112006, 92062, 92856, 67812, 70736], name: "Object 1"},
%{count: 655, id: [92572, 22432, 32368, 34180, 34181, 34182, ...], name: "Object 2"},
%{count: 238, id: [26052, 30430, 37067, 37068, 41228, 42686, ...], name: "Object 3"}
...
]
list1 包含 30000 多个地图,list2 包含大约 100 个地图,两个列表中的 id 相同,我想将两个列表合并为一个:
[
%{count: 5, all_count: 5 name: "Object 1"},
%{count: 655, all_count: 3, name: "Object 2"},
....
]
使用新的 all_count-key,它是来自 list1 的所有金额的总和,具有与 list2 中的 id-array 中相同的 id。
我做到了:
Enum.map(list2, fn(map) ->
all_count =
list1
|> Enum.filter(&Enum.member?(map.id, &1.id))
|> Enum.map(&(&1.amount))
|> Enum.sum
Map.put(map, :all_count, all_count)
end)
witch 可以工作,但速度很慢,我需要更快的东西,尝试使用 Flow:
Enum.map(list2, fn(map) ->
all_count =
list1
|> Flow.from_enumerable()
|> Flow.filter(&Enum.member?(map.id, &1.id))
|> Flow.map(&(&1.amount))
|> Enum.sum
Map.put(map, :all_count, all_count)
end)
得到它有点快但不多,任何提示如何更快地得到它?蒂亚。
【问题讨论】:
标签: elixir