2017-06-19 64 views
0

我试图比较两个不同的地图。第一个是我的模块中的常数:比较两张不同地图的按键。药剂

@list_items %{apples: 2, orange: 1, banana: 3} 

这是作为key:项目名称,value:商品价格。

然后我的函数如下所示:

def purchase(items) do 
    items 
    |> Map.merge(@list_items) 
end 

基本上就是我想要做的就是这个。如果在函数中传入的items与任何键匹配,它将返回一个包含匹配映射的修改映射,并将这些值相互相乘。这应该返回基于常数中定义的总价格。这是一个测试,以澄清:

test "#purchase/1" do 
    assert ProblemModule.purchase(%{apples: 4}) == 8 
end 

我想了解药剂。这个人为的问题有望帮助我。

回答

1

我会使用for计算每个项目的价格,然后用Enum.sum/1概括:

Enum.sum(for {name, quantity} <- items, do: list_items[name] * quantity) 
iex(1)> list_items = %{apples: 2, orange: 1, banana: 3} 
%{apples: 2, banana: 3, orange: 1} 
iex(2)> items = %{apples: 4} 
%{apples: 4} 
iex(3)> Enum.sum(for {name, quantity} <- items, do: list_items[name] * quantity) 
8 
iex(4)> items = %{apples: 4, orange: 9} 
%{apples: 4, orange: 9} 
iex(5)> Enum.sum(for {name, quantity} <- items, do: list_items[name] * quantity) 
17 
+0

哇,这是完善。我只是检查列表解析! – Bitwise

2

你可以使用折叠

list_items = %{apples: 2, orange: 1, banana: 3} 

purchases = %{apples: 4, orange: 10} 

purchases 
|> Enum.to_list() 
|> List.foldl(0, fn {key, value}, acc -> 
    list_items[key] * value + acc 
end)