enums - 尝试使用 Enum.reduce

标签 enums elixir

尝试转换以下模板

[
  %{ids: ["A123"], name: "Red"},
  %{ids: ["A123"], name: "Blue"},
  %{ids: ["B123"], name: "Blue"}
]

[
  %{ids: ["A123"], name: "Red"},
  %{ids: ["A123", "B123"], name: "Blue"},
]

如果键名相同,则将 id 合并到一个列表中。例如:名称 blue 有两个 id 并合并 t0 一个列表。任何人都可以帮助我使用 Enum.reduce 来实现这一点

最佳答案

data = [
  %{ids: ["A123"], name: "Red"},
  %{ids: ["A123"], name: "Blue"},
  %{ids: ["B123"], name: "Blue"}
]

使用Enum.group_by/3List.flatten/1 :

data
|> Enum.group_by(&(&1.name), &(&1.ids))
|> Enum.map(fn {color, ids} -> %{name: color, ids: List.flatten(ids)} end)

使用Enum.reduce/3Map.update/4 :

data
|> Enum.reduce(%{}, fn %{ids: ids, name: name}, acc ->
  Map.update(acc, name, ids, fn prev_ids -> prev_ids ++ ids end)
end)
|> Enum.map(fn {color, ids} -> %{name: color, ids: ids} end)

如您所见,使用 group_by 稍微简洁一点,而且可能更清晰。两种方法都使用中间映射来使分组更容易。

关于enums - 尝试使用 Enum.reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69544217/

相关文章:

jquery - 遍历枚举、TypeScript 和 JQuery

python - 将 C 枚举导入到 python 中而不包含完整的 header ?

templates - Phoenix : render template of other folder

mysql - 在 Ecto/Phoenix 中用微秒断言时间戳等于 mysql 数据库值

erlang - 获取任意整数的大小(以字节为单位)

elixir - `mix ecto.rollback` 和 `mix ecto.migrate` 命令的调试级别日志记录

Java返回正确类型的枚举

c++ - 从limemicro编译lms6suite时出现枚举错误

java - 为什么 reflections.getSubTypesOf(Object.class) 找不到枚举?

list - 在 Elixir 中有效压缩不等长列表