比较来自两个不同地图的键

时间:2017-06-19 20:07:29

标签: maps elixir phoenix-framework

我试图比较两个不同的地图。第一个是我模块中的常量:

@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

2 个答案:

答案 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