地图中的Elixir map_values?

时间:2019-04-09 13:10:41

标签: elixir

没有标准的lib函数,该函数允许在.eslintrc上执行"extends": [ "airbnb", "plugin:react-redux/recommended", "plugin:promise/recommended" ], "parser": "babel-eslint", "parserOptions": { "ecmaVersion": 8, "ecmaFeatures": { "experimentalObjectRestSpread": true, "impliedStrict": true, "classes": true } }, "env": { "browser": true, "node": true, "jquery": true, "jest": true }, "plugins": [ "react-redux", "promise" ], 函数:

map_values

我发现的最好方法是:

map

由于我经常使用它,因此我发现它很重...

3 个答案:

答案 0 :(得分:4)

我不这么认为,但是您可以使用Map.new/2更简洁地做到这一点:

iex> Map.new(%{a: 30, b: 45}, fn {k, v} -> {k, v * 2} end)
%{a: 60, b: 90}

答案 1 :(得分:3)

另一种替代方法是理解,例如

a = %{a: 30, b: 45}
    for {k, v} <- a, into: %{} do
      {k, v + 1}
    end

输出:

%{a: 31, b: 46}

通过这种方式,您不会创建中间列表,因为Enum.map返回一个列表,然后您需要将其转换为map。 这里的重要部分是into: %{},因为如果您省略它,默认情况下它将返回一个列表。

答案 2 :(得分:2)

虽然已经给出的答案是完全正确的,但为了详尽无遗,我将发布另一个变体:Enum.into/3也可以使用,因为Map实现了{{3} } 协议。

Enum.into(%{a: 30, b: 45}, %{}, fn {k, v} -> {k, v * 2} end)
#⇒ %{a: 60, b: 90}