2017-06-19 10 views
0

私は2つの異なるマップを比較しようとしています。最初のものは私のモジュール内で一定である:2つの異なるマップからキーを比較します。エリクシル

@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) 
関連する問題