更新结构列表的最佳方法

时间:2019-10-20 18:01:42

标签: elixir

比方说,我有一个结构体列表,其中一个id作为其键之一:

users = [
  %User{id: 1, attempts: 5},
  %User{id: 2, attempts: 12},
  %User{id: 3, attempts: 2}
]

id == 2将尝试次数更新为99的用户以获取新的用户列表的最佳方法(最灵丹妙药的方法)是什么:

updated_users = [
  %User{id: 1, attempts: 5},
  %User{id: 2, attempts: 99},
  %User{id: 3, attempts: 2}
]

感谢您的帮助!

3 个答案:

答案 0 :(得分:5)

Enum.map(users, fn
  %User{id: 2} = user -> %User{user | attempts: 99}
  user -> user
end)

您可以将其封装到某个模块中,并给它一个好听的名字:)

答案 1 :(得分:3)

可以说,最妖e的方法是使用Access行为和Kernel.put_in/3

<img src="images/image.jpg" alt="image" class="border2" />

通过更改过滤器功能,可以很容易地扩展它以更新多个元素。

答案 2 :(得分:0)

如果您要进行许多更新,最好构建一个地图,这样就不必为每个更新重复列表。

[
  %User{attempts: 5, id: 1},
  %User{attempts: 12, id: 2},
  %User{attempts: 2, id: 3}
]
|> Map.new(fn user -> {user.id, user} end)
|> Map.update!(2, &%User{&1 | attempts: 99})
|> Map.values()

您可以根据需要进行Map.update!/3个调用,以更新不同的ID。