长生不老药,迭代嵌套地图



我是长生不老药的新手,我正在尝试从非常嵌套的地图中获取一些文字。

所以我正在对此链接进行get请求,并且我正在用jason.decode进行解码。

我想做的是迭代并获取每个文本值(章节 -> 0-> content-> 0->文本)。

最后,我只希望它是所有文本值的大字符串

(链接总是可以更改,以便可能有更多的地图等)

预先感谢!

您可以将Enum与管道操作员|>一起列举数据结构并提取所需的部分。

例如:

def pokedex(id) do
  HTTPoison.get!("https://pokemon.fandom.com/api/v1/Articles/AsSimpleJson?id=#{id}")
  |> Map.get(:body)
  |> Jason.decode!()
  |> Map.get("sections")
  |> Enum.reject(fn %{"content" => content} -> content === [] end)
  |> Enum.flat_map(fn %{"content" => content} ->
    content
    |> Enum.filter(fn %{"type" => type} -> type in ["text", "paragraph"] end)
    |> Enum.map(fn %{"text" => text} -> text end)
  end)
  |> Enum.join("n")
end

崩溃:

  • Map.get("sections")选择sections的内容。
  • Enum.reject(...)忽略空的部分。
  • Enum.flat_map在各节上迭代,获取每个部分的contents,使用内部函数对其进行转换,然后将结果弄平到单个列表中。
    • Enum.filter(...)仅处理type属性为textparagraph的过程内容。
    • Enum.map从每个目录地图中提取text属性。
  • Enum.join加入带有新线字符的字符串列表。

elixir提供(通过erlang)一些功能,这些功能可以反思数据结构以检查其类型(例如 is_map/1, is_list/1, is_number/1, is_boolean/1, is_binary/1, is_nil/1等)。从docs

尝试使用响应中将拥有的常见数据类型。它们可能是原始图的原始,地图或原始列表,其中原始词像布尔,数字或字符串一样。

编写一个函数,该函数试图递归通过您获得的数据结构,直到达到原始的功能,然后返回串联的原始

ex。对于地图,请浏览每个值(忽略密钥),如果该值不是原始值,请用该节点递归调用该函数,直到您达到原始词并可以返回旋格的值。列表类似

类似的东西应该有效:

defmodule Test do
  def stringify(data) do
    cond do
      # <> is concatenation operator
      # -- call stringify() for every value in map and return concatenated string
      is_map(data) -> data |> Map.values |> Enum.reduce("", fn x, acc -> acc <> stringify(x) end)
      # -- call stringify() for every element in list and return concatenated string
      is_list(data) -> data |> Enum.reduce("", fn x, acc -> acc <> stringify(x) end)
      is_boolean(data) -> to_string(data)
      is_number(data) -> to_string(data)
      is_binary(data) -> data # elixir strings are binaries
      true -> ""
    end
  end
end
# For testing...
{:ok, %HTTPoison.Response{body: sbody}} = HTTPoison.get("https://pokemon.fandom.com/api/v1/Articles/AsSimpleJson?id=2409")
{:ok, body} = Poison.decode(sbody)
Test.stringify(body)
# returns
"Cyndaquil (Japanese: ヒノアラシ Hinoarashi) is the Fire-type Starter..."

如果将外部软件包用于此任务是一个选项,则可以尝试我为此目的编写的软件包: Iteraptor

它提供了迭代/MAP/减少嵌套 elixir 枚举的术语的功能。

相关内容

  • 没有找到相关文章

最新更新