获取所有地图密钥

时间:2017-04-03 22:39:35

标签: elixir

在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, " - ")

4 个答案:

答案 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