Elixir 进入深度嵌套的映射和列表
我有一张这样的地图:Elixir 进入深度嵌套的映射和列表,elixir,Elixir,我有一张这样的地图: %{ "conferences" => [ %{ "alias" => "EASTERN", "divisions" => [ %{ "alias" => "SOUTHEAST", "id" => "54dc7348-c1d2-40d8-88b3-c4c0138e085d", "name" => "Southeast",
%{
"conferences" => [
%{
"alias" => "EASTERN",
"divisions" => [
%{
"alias" => "SOUTHEAST",
"id" => "54dc7348-c1d2-40d8-88b3-c4c0138e085d",
"name" => "Southeast",
"teams" => [
%{
"alias" => "WAS",
"id" => "583ec8d4-fb46-11e1-82cb-f4ce4684ea4c",
"market" => "Washington",
"name" => "Wizards",
"reference" => "1610612764",
"sr_id" => "sr:team:3431",
"venue" => %{
"address" => "601 F St. N.W.",
"capacity" => 20356,
"city" => "Washington",
"country" => "USA",
"id" => "f62d5b49-d646-56e9-ba60-a875a00830f8",
"name" => "Capital One Arena",
"state" => "DC",
"zip" => "20004"
}
}
]
},
],
"id" => "3960cfac-7361-4b30-bc25-8d393de6f62f",
"name" => "EASTERN CONFERENCE"
},
%{
"alias" => "WESTERN",
"divisions" => [
%{
"alias" => "NORTHWEST",
"id" => "12bf14ba-eb16-4c6f-8275-e801b6947c1e",
"name" => "Northwest",
"teams" => [
%{
"alias" => "DEN",
"id" => "583ed102-fb46-11e1-82cb-f4ce4684ea4c",
"market" => "Denver",
"name" => "Nuggets",
"reference" => "1610612743",
"sr_id" => "sr:team:3417",
"venue" => %{
"address" => "1000 Chopper Circle",
"capacity" => 19155,
"city" => "Denver",
"country" => "USA",
"id" => "1a28ef88-76c9-5bcc-b4ee-51d30ca98f4f",
"name" => "Pepsi Center",
"sr_id" => "sr:venue:5976",
"state" => "CO",
"zip" => "80204"
}
}
]
}
],
"id" => "7fe7e212-de01-4f8f-a31d-b9f0a95731e3",
"name" => "WESTERN CONFERENCE"
}
],
"league" => %{
"alias" => "NBA",
"id" => "4353138d-4c22-4396-95d8-5f587d2df25c",
"name" => "NBA"
}
}
ids =
for conference <- data["conferences"],
division <- conference["divisions"],
team <- division["teams"],
do: team["id"]
IO.inspect ids
如何仅提取团队ID
?因此,我最终得到了一个类似以下内容的列表:<代码>=>[“583ec8d4-fb46-11e1-82cb-f4ce4684ea4c”,“583ed102-fb46-11e1-82cb-f4ce4684ea4c”]
当前尝试:
如果数据
表示上述地图
conferences = get_in(data, ["conferences"])
divisions = Enum.map(conferences, fn(c) -> c["divisions"] end)
Enum.map(divisions, fn(d) -> d["teams"] end)
错误消息:
问题是
c[“部门”]
本身就是一个列表,因此您最终会得到部门中的列表列表,这使得最后一个Enum.map
失败,因为您试图访问列表的[“团队”]
。如果要处理所有会议中的所有分区,只需将第二行从Enum.map
更改为Enum.flat\u map
:
divisions = Enum.flat_map(conferences, fn(c) -> c["divisions"] end)
此外,我会使用for
编写整个过程,如下所示:
%{
"conferences" => [
%{
"alias" => "EASTERN",
"divisions" => [
%{
"alias" => "SOUTHEAST",
"id" => "54dc7348-c1d2-40d8-88b3-c4c0138e085d",
"name" => "Southeast",
"teams" => [
%{
"alias" => "WAS",
"id" => "583ec8d4-fb46-11e1-82cb-f4ce4684ea4c",
"market" => "Washington",
"name" => "Wizards",
"reference" => "1610612764",
"sr_id" => "sr:team:3431",
"venue" => %{
"address" => "601 F St. N.W.",
"capacity" => 20356,
"city" => "Washington",
"country" => "USA",
"id" => "f62d5b49-d646-56e9-ba60-a875a00830f8",
"name" => "Capital One Arena",
"state" => "DC",
"zip" => "20004"
}
}
]
},
],
"id" => "3960cfac-7361-4b30-bc25-8d393de6f62f",
"name" => "EASTERN CONFERENCE"
},
%{
"alias" => "WESTERN",
"divisions" => [
%{
"alias" => "NORTHWEST",
"id" => "12bf14ba-eb16-4c6f-8275-e801b6947c1e",
"name" => "Northwest",
"teams" => [
%{
"alias" => "DEN",
"id" => "583ed102-fb46-11e1-82cb-f4ce4684ea4c",
"market" => "Denver",
"name" => "Nuggets",
"reference" => "1610612743",
"sr_id" => "sr:team:3417",
"venue" => %{
"address" => "1000 Chopper Circle",
"capacity" => 19155,
"city" => "Denver",
"country" => "USA",
"id" => "1a28ef88-76c9-5bcc-b4ee-51d30ca98f4f",
"name" => "Pepsi Center",
"sr_id" => "sr:venue:5976",
"state" => "CO",
"zip" => "80204"
}
}
]
}
],
"id" => "7fe7e212-de01-4f8f-a31d-b9f0a95731e3",
"name" => "WESTERN CONFERENCE"
}
],
"league" => %{
"alias" => "NBA",
"id" => "4353138d-4c22-4396-95d8-5f587d2df25c",
"name" => "NBA"
}
}
ids =
for conference <- data["conferences"],
division <- conference["divisions"],
team <- division["teams"],
do: team["id"]
IO.inspect ids
问题是c[“部门”]
本身就是一个列表,因此您最终会得到部门中的列表列表,这使得最后一个Enum.map
失败,因为您试图访问列表的[“团队”]
。如果要处理所有会议中的所有分区,只需将第二行从Enum.map
更改为Enum.flat\u map
:
divisions = Enum.flat_map(conferences, fn(c) -> c["divisions"] end)
此外,我会使用for
编写整个过程,如下所示:
%{
"conferences" => [
%{
"alias" => "EASTERN",
"divisions" => [
%{
"alias" => "SOUTHEAST",
"id" => "54dc7348-c1d2-40d8-88b3-c4c0138e085d",
"name" => "Southeast",
"teams" => [
%{
"alias" => "WAS",
"id" => "583ec8d4-fb46-11e1-82cb-f4ce4684ea4c",
"market" => "Washington",
"name" => "Wizards",
"reference" => "1610612764",
"sr_id" => "sr:team:3431",
"venue" => %{
"address" => "601 F St. N.W.",
"capacity" => 20356,
"city" => "Washington",
"country" => "USA",
"id" => "f62d5b49-d646-56e9-ba60-a875a00830f8",
"name" => "Capital One Arena",
"state" => "DC",
"zip" => "20004"
}
}
]
},
],
"id" => "3960cfac-7361-4b30-bc25-8d393de6f62f",
"name" => "EASTERN CONFERENCE"
},
%{
"alias" => "WESTERN",
"divisions" => [
%{
"alias" => "NORTHWEST",
"id" => "12bf14ba-eb16-4c6f-8275-e801b6947c1e",
"name" => "Northwest",
"teams" => [
%{
"alias" => "DEN",
"id" => "583ed102-fb46-11e1-82cb-f4ce4684ea4c",
"market" => "Denver",
"name" => "Nuggets",
"reference" => "1610612743",
"sr_id" => "sr:team:3417",
"venue" => %{
"address" => "1000 Chopper Circle",
"capacity" => 19155,
"city" => "Denver",
"country" => "USA",
"id" => "1a28ef88-76c9-5bcc-b4ee-51d30ca98f4f",
"name" => "Pepsi Center",
"sr_id" => "sr:venue:5976",
"state" => "CO",
"zip" => "80204"
}
}
]
}
],
"id" => "7fe7e212-de01-4f8f-a31d-b9f0a95731e3",
"name" => "WESTERN CONFERENCE"
}
],
"league" => %{
"alias" => "NBA",
"id" => "4353138d-4c22-4396-95d8-5f587d2df25c",
"name" => "NBA"
}
}
ids =
for conference <- data["conferences"],
division <- conference["divisions"],
team <- division["teams"],
do: team["id"]
IO.inspect ids
虽然@Dogbert的答案通常都很好,也非常有效,但为了未来的访问者,我会发布另一种方法(在这种特殊情况下,它比使用理解的方法更冗长,一般来说更糟糕)
这个正在使用
数据
|>上车([
访问密钥(“会议”),
Access.all(),
访问键(“分区”),
Access.all(),
访问。关键(“团队”),
Access.all(),
访问密钥(“id”)
])
|>列表。展平
#⇒[“583ec8d4-fb46-11e1-82cb-f4ce4684ea4c”,
#“583ed102-fb46-11e1-82cb-f4ce4684ea4c”]
虽然@Dogbert的答案通常都很好而且非常有效,但为了未来的访问者,我会发布另一种方法(在这种特殊情况下,它比使用理解的方法更详细,而且通常更糟糕。)
这个正在使用
数据
|>上车([
访问密钥(“会议”),
Access.all(),
访问键(“分区”),
Access.all(),
访问。关键(“团队”),
Access.all(),
访问密钥(“id”)
])
|>列表。展平
#⇒[“583ec8d4-fb46-11e1-82cb-f4ce4684ea4c”,
#“583ed102-fb46-11e1-82cb-f4ce4684ea4c”]