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

如何仅用Elixir内置函数实现嵌套Map的所有键路径获取?

问题描述

我目前使用iteraptor库完成了从嵌套Map中提取所有键路径的任务,编写了如下测试用例:

defmodule MapanalizTest do
  use ExUnit.Case
  doctest Mapanaliz

  test "all_path_list/1" do
    assert Mapanaliz.all_path_list(%{}) == []
    assert Mapanaliz.all_path_list(%{a1: 1}) == [[:a1]]
    assert Mapanaliz.all_path_list(%{a1: 1, a2: 1}) == [[:a1], [:a2]]
    assert Mapanaliz.all_path_list(%{a1: %{b1: 1}}) == [[:a1], [:a1, :b1]]
    assert Mapanaliz.all_path_list(%{a1: 1, a2: %{b1: 1}}) == [[:a1], [:a2], [:a2, :b1]]

    assert Mapanaliz.all_path_list(%{a1: 1, a2: %{a2b1: 1, a2b2: 1}}) ==
             [[:a1], [:a2], [:a2, :a2b1], [:a2, :a2b2]]

    assert Mapanaliz.all_path_list(%{a: %{c: 1, d: 1}, b: %{e: 1}}) ==
             [[:a], [:b], [:a, :c], [:a, :d], [:b, :e]]

    assert Mapanaliz.all_path_list(%{z1: %{y11: 1, y12: 1}, z2: %{y21: %{x221: 1}}}) ==
             [[:z1], [:z2], [:z1, :y11], [:z1, :y12], [:z2, :y21], [:z2, :y21, :x221]]
  end
end

当前基于Iteraptor的实现代码如下:

defmodule Mapanaliz do
  def all_path_list(xmap) do
    case xmap do
      %{} -> []
    end

    xmap
    |> Iteraptor.reduce([], fn {k, _}, acc ->
      [Enum.join(k, ", ") | acc]
    end, yield: :all)
    |> :lists.reverse()
end

现希望不依赖任何外部库,仅使用Elixir内置函数实现相同功能,该如何操作?


纯Elixir内置函数实现方案

可以通过递归遍历嵌套Map的方式实现,核心逻辑是逐层拆解Map,记录每个键的完整路径:

defmodule Mapanaliz do
  def all_path_list(%{} = xmap) do
    xmap
    |> Enum.flat_map(fn {key, value} ->
      # 先记录当前键的单级路径
      current_path = [key]
      # 如果值是嵌套Map,递归获取子路径并拼接当前键
      child_paths =
        if is_map(value) do
          all_path_list(value) |> Enum.map(&[key | &1])
        else
          []
        end
      # 合并当前路径与所有子路径
      [current_path | child_paths]
    end)
  end

  # 处理空Map的边界情况
  def all_path_list(%{}), do: []
end

代码说明

  • 用Enum.flat_map/2遍历每个键值对,自动合并所有子列表的结果,避免手动拼接列表
  • 对每个键,先生成单级路径[key],对应测试用例中每个父级键的单独路径
  • 当值为嵌套Map时,递归调用all_path_list/1获取子Map的所有路径,再通过Enum.map/2把当前键加到每个子路径的头部,形成完整的嵌套路径
  • 空Map直接返回空列表,匹配测试用例的边界条件

替换原实现后,所有测试用例均可通过,输出结果与使用iteraptor时完全一致。

内容的提问来源于stack exchange,提问作者Sana

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 07:25:18