【问题标题】:Get all Map keys获取所有 Map 键
【发布时间】:2017-04-04 13:05:05
【问题描述】:

有没有办法在 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, " - ")

【问题讨论】:

    标签: elixir


    【解决方案1】:

    你可以使用Map.keys/1:

    map = %{a: 1, b: 2}
    Map.keys(map)
    #=> [:a, :b]
    

    【讨论】:

      【解决方案2】:

      如果您运行 iex 并在模块名称后键入 TAB,它将列出模块导出的所有函数。

      iex> h 地图。\'TAB\'

      iex(1)> h Map.keys

                                   def keys(map)
      

      返回地图中的所有键。

      示例

      iex> Map.keys(%{a: 1, b: 2})
      [:a, :b]
      

      您可能想查看MapSet 的文档,这或多或少是您使用一些其他有用的方法所做的事情。

      【讨论】:

        【解决方案3】:

        我可以用这个来实现它

        Enum.uniq(Enum.map(lines, fn line -> line.name end))
        

        【讨论】:

          【解决方案4】:

          虽然给出的答案提供了如何获取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}
          

          在我看来,这种方式更具可读性、灵性和(对于许多重复项)效率更高。当然,在生产代码中去掉IO.inspect

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-12-19
            • 2022-12-02
            • 2014-12-26
            • 2015-02-13
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多