在elixir中有没有办法让所有的地图键与PHP中的array_keys
类似?我一直在寻找,但似乎无法找到办法。
还是有另一种方法可以获得独特的价值观吗?我正在为地图中的键指定名称1
,以仅获取不同的值。然后我想获得只检索唯一值的键。
我正在使用此代码创建我的地图:
names = Enum.reduce lines, %{}, fn line, acc ->
Map.put(acc, line.name, 1)
end
例如,我有两行line.name
作为测试。我希望最终结果只返回测试。或者如果它们不同,则单独返回它们,然后使用类似enum.join
的内容来组合它们
Enum.join(names, " - ")
答案 0 :(得分:12)
您可以使用Map.keys/1
:
map = %{a: 1, b: 2}
Map.keys(map)
#=> [:a, :b]
答案 1 :(得分:2)
如果运行iex并在模块名称后键入TAB,它将列出模块导出的所有函数。
IEX> h Map。\' TAB \'
IEX(1)> h Map.keys
def keys(map)
从地图返回所有键。
实施例
iex> Map.keys(%{a: 1, b: 2}) [:a, :b]
您可能希望查看MapSet
的文档,或多或少使用其他一些有用的方法来处理您的工作。
答案 2 :(得分:0)
我能够使用此
实现它Enum.uniq(Enum.map(lines, fn line -> line.name end))
答案 3 :(得分:-1)
虽然给出的答案提供了如何获得Map
键的最终解决方案,但在阅读完整个问题之后,我得出的结论是你从头开始做错了。
首先,你制作地图的方式是恕我直言,不是最可读的。意图不够明确。让我们从唯一性开始:
lines = [%{name: "test", a: 42},
%{name: "test", b: 42},
%{name: "foo"}]
#⇒ [%{a: 42, name: "test"},
# %{b: 42, name: "test"},
# %{name: "foo"}]
Enum.map(lines, & &1.name)
#⇒ ["test", "test", "foo"]
几乎我们需要的东西。让我们把它们搞定:
lines |> Enum.map(& &1.name) |> Enum.uniq
#⇒ ["test", "foo"]
冷却。我们现在制作一张地图:
lines
|> Enum.map(& &1.name)
|> IO.inspect #⇒ ["test", "test", "foo"]
|> Enum.uniq
|> IO.inspect #⇒ ["test", "foo"]
|> Enum.zip(Stream.cycle [1])
|> IO.inspect #⇒ [{"test", 1}, {"foo", 1}]
|> Enum.into(%{}) #⇒ %{"foo" => 1, "test" => 1}
在我看来,这是更具可读性,elixirish和(对于许多重复)有效的方式。当然,摆脱生产代码中的IO.inspect
。