Elixir使用Enum.reduce过滤User列表合并Subject数据生成新映射列表
实现代码
首先提前提取Subject中需要复用的公共字段,再通过Enum.reduce遍历用户列表完成筛选和合并:
# 提取公共字段,避免遍历过程中重复取值 common = %{ sub_id: subject.sub_id, sub_name: subject.content.sub_name } result = Enum.reduce(users, [], fn user, acc -> if user.status == "A" do # 结构体转普通映射后取所需字段,和公共字段合并 merged = user |> Map.from_struct() |> Map.take([:id, :name]) |> Map.merge(common) acc ++ [merged] else # 不符合条件直接返回原有累加器 acc end end)
说明
- 如果需要保留User结构体的所有字段,去掉
Map.take([:id, :name])这一行即可 - 若处理的用户列表量级很大,可以把
acc ++ [merged]替换为[merged | acc],最后对结果做一次反转,性能更好
内容的提问来源于stack exchange,提问作者VR_1
相关产品推荐
相关产品推荐

