比方说,我有一个结构体列表,其中一个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}
]
感谢您的帮助!
答案 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。