如何将键值对放入具有变量键名称的映射中

时间:2015-04-24 01:22:38

标签: elixir

我正在尝试使用包含许多不同首选项的单个地图,它应该如下所示:

%{some_preference_name:%{foo:"bar"},another_preference_name:%{foo:"bar"}}

我有一个数据库中的首选项映射列表,我需要通过它们并将“首选项”字段设置为键,其中各种值作为值映射。

我尝试用Enum.reduce和Enum做地图,但我无法将列表正确。

Enum.map(preferences, fn(data)->
  Map.put(%{}, data.preference,
   %{
     foo: data.foo
    }
  )
end)

返回:

[{some_preference_name:%{foo:"bar"}},{another_preference_name:%{foo:"bar"}}]

然后:

Enum.reduce(preferences, fn(acc, data)->
  Map.put(acc, data.preference,
   %{
     foo: data.foo
    }
  )
end)

返回:

%{some_preference_name:%{foo:"bar"},preference: "another_preference_name",foo:"bar"}

它是第一个正确的,但不是其余的。据我所知,从Erlang R17开始,我能够添加变量键名的唯一方法是Map.put / 3.

3 个答案:

答案 0 :(得分:10)

您的代码几乎是正确的,您刚刚在reduce函数中交换了参数顺序:

Enum.reduce(preferences, fn(data, acc)->
  Map.put(acc, data.preference, %{foo: data.foo})
end)

答案 1 :(得分:8)

你现在可以(因为<html> <head> <title>Test</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.0/jquery.min.js"></script> </head> <body> <div> <input class="btn1" type="button" value="Yes" /> </div> <div> <input class="btn1" type="button" value="No"/> </div> <div> <input class="btn1" type="button" value="Maybe"/> </div> <div> <input class="btn1" type="button" value="Later"/> </div> <div id="display"> </div> <script> $(document).ready(function() { $('.btn1').click(function(e) { e.preventDefault(); document.getElementById('display').innerHTML=$(this).val(); }); }); </script> </body> </html> )没有任何黑客攻击。 这在the changes overview的语言改进部分中列出。

这是怎么做的:

Elixir 1.2.0

如果您想模拟匹配现有变量 - 请使用iex> key = :hello iex> value = "world" iex> %{key => value} %{:hello => "world"} 运算符:

^

答案 2 :(得分:0)

尝试使用hd()tl()进行递归来获取列表项而不是Enum.mapEnum.reduce

def get_preference() do
    preferences = [%{:preference => "some_preference_name", :foo => "bar"}, %{:preference => "another_preference_name", :foo => "rab"}]
    convert(preferences, %{})
end

def convert([], map) do
    map
end

def convert([head|tail], map) do
    map = Map.put(map, head.preference, %{foo: head.foo})
    convert(tail, map)
end

希望它对你有用。