将项目拆分为Elixir中的多个项目

时间:2017-02-09 11:02:08

标签: elixir

我有一个地址列表,我需要修复记录,一些记录将门牌号作为范围,我需要将其拆分为多个记录。我如何枚举列表并修复/复制记录?

defmodule EnumTesting do

  def list_stuff() do
    list = [ %{street: "street", nr: "2" }, %{street: "street", nr: "4" }, %{street: "street", nr: "6-10" } ]
    list |> Enum.filter(&needs_fixing?(&1))
  end

  defp needs_fixing?(item) do
    String.contains?(item.nr, "-")
  end

end

预期结果:

[ %{street: "street", nr: "2" }, %{street: "street", nr: "4" }, %{street: "street", nr: "6" }, %{street: "street", nr: "8" }, %{street: "street", nr: "10" } ]

2 个答案:

答案 0 :(得分:1)

need_fixing?很好,所以你需要做的就是实现修复功能。

def fixing_function(%{nr: range, street: street}) do
  [a, b] = range |> String.split("-") |> Enum.map(&String.to_integer/1)
  for value <- Range.new(a, b), do: %{street: street, nr: "#{value}"}
end

这为您提供了固定地址,您可以添加将此列表附加到有效条目列表中。

它返回6,7,8,9和10的条目。要仅将其用于偶数或奇数,您可以应用简单的过滤函数,使用:lists:seqStream.iterate

答案 1 :(得分:0)

def fix!(%{street: street, nr: nr}) do
  case Regex.scan(~r|\d+|, nr, capture: :all_but_first) do
    [nr] -> [%{street: street, nr: nr}]
    [from, two] -> String.to_integer(from)..String.to_integer(to)
                   |> Enum.map(fn i -> %{street: street, nr: "#{i}"} end)
    _ -> raise "Something went wrong: input is incorrect!"
  end
end

def list_stuff() do
  list = [%{street: "street", nr: "2" }, 
          %{street: "street", nr: "4" },
          %{street: "street", nr: "6-10" } ]
  list |> Enum.flat_map(&fix!/1)
end

以上内容将返回最后一个元素的{5 {1}}到6的5条记录,但正如您在评论中所述,您知道如何处理该问题。