我试图比较两个不同的地图。第一个是我模块中的常量:
@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
答案 0 :(得分: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)
答案 1 :(得分:1)
我会使用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
su root setenforce 0