存在重复值时如何映射对象?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
相关产品推荐
相关产品推荐

