我正在尝试使用包含许多不同首选项的单个地图,它应该如下所示:
%{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.
答案 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.map
和Enum.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
希望它对你有用。