我有一个地址列表,我需要修复记录,一些记录将门牌号作为范围,我需要将其拆分为多个记录。我如何枚举列表并修复/复制记录?
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" } ]
答案 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:seq
或Stream.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条记录,但正如您在评论中所述,您知道如何处理该问题。