Elixir 我如何创建嵌套的组_by?
基本上,我尝试获取数据并使用Enum.group_by创建字典,但我希望继续按子类别对相同的数据进行分组 数据=[ %{公司:一号公司,州:洛杉矶,规模:100}, %{公司:一号公司,州:洛杉矶,规模:200}, %{公司:第二公司,州:德克萨斯州,规模:200}, %{公司:第二公司,州:洛杉矶,规模:300}, %{公司:三公司,州:洛杉矶,规模:400}, %{公司:四公司,州:德克萨斯州,规模:500} ] 我想先按公司分组,然后在地图组中按州分组,再在嵌套地图组中按大小分组。本质上是一个包含两个嵌套映射和一个对应数据数组的映射 %{公司一=>%{ LA=>%{ 100 => [ %{公司:一号公司,州:洛杉矶,规模:100} ], 200 => [ %{公司:一号公司,州:洛杉矶,规模:200} ] } } } 我的尝试看起来像这样 列表= 数据 |>Enum.group_byfn x->x.company end keys=Map.keysdata 更新的_列表= 对于键Enum.group_byfn x->x.state end 终止Elixir 我如何创建嵌套的组_by?,elixir,Elixir,基本上,我尝试获取数据并使用Enum.group_by创建字典,但我希望继续按子类别对相同的数据进行分组 数据=[ %{公司:一号公司,州:洛杉矶,规模:100}, %{公司:一号公司,州:洛杉矶,规模:200}, %{公司:第二公司,州:德克萨斯州,规模:200}, %{公司:第二公司,州:洛杉矶,规模:300}, %{公司:三公司,州:洛杉矶,规模:400}, %{公司:四公司,州:德克萨斯州,规模:500} ] 我想先按公司分组,然后在地图组中按州分组,再在嵌套地图组中按大小分组。本质上是
我使用了Enum.group_by/1作为初始格式,但之后尝试的任何操作都会将数据结构搞砸。任何帮助都会很好。谢谢。它不太漂亮,但你可以这样做: Enum.group_bydata和&1.company |>Map.newfn{k,v}-> {k, Enum.group_byv和&1.state |>Map.newfn{k,v}->{k,Enum.group_byv,&&1.size}end} 终止 结果: %{ 公司四=>%{ TX=>%{500=>[%{company:company_-four,size:500,state:TX}]} }, 公司一=>%{ LA=>%{ 100=>[%{公司:公司,规模:100,州:洛杉矶], 200=>[%{公司:一家公司,规模:200,州:洛杉矶] } }, 公司三=>%{ LA=>%{400=>[%{company:company_-three,size:400,state:LA}]} }, 公司二=>%{ LA=>%{300=>[%{company:company_-two,size:300,state:LA}]}, TX=>%{200=>[%{company:company_two,size:200,state:TX}]} } }
这不是很漂亮,但你可以这样做: Enum.group_bydata和&1.company |>Map.newfn{k,v}-> {k, Enum.group_byv和&1.state |>Map.newfn{k,v}->{k,Enum.group_byv,&&1.size}end} 终止 结果: %{ 公司四=>%{ TX=>%{500=>[%{company:company_-four,size:500,state:TX}]} }, 公司一=>%{ LA=>%{ 100=>[%{公司:公司,规模:100,州:洛杉矶], 200=>[%{公司:一家公司,规模:200,州:洛杉矶] } }, 公司三=>%{ LA=>%{400=>[%{company:company_-three,size:400,state:LA}]} }, 公司二=>%{ LA=>%{300=>[%{company:company_-two,size:300,state:LA}]}, TX=>%{200=>[%{company:company_two,size:200,state:TX}]} } }
我发现这个问题很有意思,最后用了一种通用的方法——只需传递你的结构和你想要分组的键 defmodule NESTEGROUP do 解除访问密钥[key],do:[access.keykey,[] defp access|u keys[key | rest],do:[access.keykey,%{}| access|u keysrest] def嵌套的_组数据,键do 数据 |>枚举减少%{},fn elt,acc-> 钥匙= Enum.mapkeys、&Map.getelt、&1 |>访问密钥 更新INAC,钥匙,fn列表->[elt |列表]结束 终止 终止 终止 我们需要access_key helper来确保最后一个键是列表,而不是地图 iex2>NestedGroup.nested_groupdata,[:公司,:州,:大小] %{ 公司四=>%{ TX=>%{500=>[%{company:company_-four,size:500,state:TX}]} }, 公司一=>%{ LA=>%{ 100=>[%{公司:公司,规模:100,州:洛杉矶], 200=>[%{公司:一家公司,规模:200,州:洛杉矶] } }, 公司三=>%{ LA=>%{400=>[%{company:company_-three,size:400,state:LA}]} }, 公司二=>%{ LA=>%{300=>[%{company:company_-two,size:300,state:LA}]}, TX=>%{200=>[%{company:company_two,size:200,state:TX}]} } }
我发现这个问题很有意思,最后用了一种通用的方法——只需传递你的结构和你想要分组的键 defmodule NESTEGROUP do 解除访问密钥[key],do:[access.keykey,[] defp access|u keys[key | rest],do:[access.keykey,%{}| access|u keysrest] def嵌套的_组数据,键do 数据 |>枚举减少%{},fn elt,acc-> 钥匙= Enum.mapkeys、&Map.getelt、&1 |>访问密钥 更新INAC,钥匙,fn列表->[elt |列表]结束 终止 终止 终止 我们需要access_key helper来确保最后一个键是列表,而不是地图 iex2>NestedGroup.nested_groupdata,[:公司,:州,:大小] %{ 公司四=>%{ TX=>%{500=>[%{company:company_-four,size:500,state:TX}]} }, 公司一=>%{ LA=>%{ 100=>[%{公司:公司,规模:100,州:洛杉矶], 200=>[%{公司:一家公司,规模:200,州:洛杉矶] } }, 公司三=>%{ LA=>%{400=>[%{公司:第三公司, 大小:400,状态:LA}]} }, 公司二=>%{ LA=>%{300=>[%{company:company_-two,size:300,state:LA}]}, TX=>%{200=>[%{company:company_two,size:200,state:TX}]} } }
美好的适用于任意数量的键太好了。也可以使用任意数量的键