2017-06-19 44 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)