You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

存在重复值时如何映射对象?Elixir列表匹配添加status字段方法

解决方案:高效给list_a元素添加重复name状态字段

嗨,这需求很常见,咱们可以用Elixir的Enum和MapSet来优雅实现,而且效率还高!

核心思路

首先把list_b里所有的name提取出来存成一个集合(MapSet)——集合的查找操作是O(1)的,比每次遍历list_b去匹配要高效得多,尤其是当列表元素很多的时候。然后遍历list_a的每个元素,判断它的name是否在这个集合里,进而添加status字段。

完整实现代码

list_a = [%{id: 1, name: "Jack"}, %{id: 2, name: "John"}]
list_b = [%{id: nil, name: "Jack"}]

# 先提取list_b的所有name到集合
list_b_names = list_b |> Enum.map(& &1.name) |> MapSet.new()

# 用Enum.map遍历添加status(简洁写法)
combined_list = Enum.map(list_a, fn obj ->
  Map.put(obj, :status, MapSet.member?(list_b_names, obj.name))
end)

# 或者用你原本计划的for循环框架,效果完全一致
combined_list = for obj <- list_a do
  Map.put(obj, :status, MapSet.member?(list_b_names, obj.name))
end

验证结果

运行上面的代码后,combined_list会得到你预期的结果:

[%{id: 1, name: "Jack", status: true}, %{id: 2, name: "John", status: false}]

为什么用MapSet?

如果list_b的元素数量很多,每次遍历list_b去匹配name的时间复杂度是O(n),而用MapSet的话,查找操作是O(1),整体时间复杂度从O(m*n)降到O(m+n),性能提升很明显。

内容的提问来源于stack exchange,提问作者D.R

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:41:12