【发布时间】:2018-01-07 18:47:47
【问题描述】:
我有包含
的订单地图列表%{price, order_details}
我想获得该订单中的 total_price,并且我还想返回使用该地图中每个元素的 order_details 构建的变更集数组。 如果不使用一个 reduce 和一个 map,我找不到一种方法,但这是两次进入列表。这是函数式编程的好习惯吗?
【问题讨论】:
标签: functional-programming elixir
我有包含
的订单地图列表%{price, order_details}
我想获得该订单中的 total_price,并且我还想返回使用该地图中每个元素的 order_details 构建的变更集数组。 如果不使用一个 reduce 和一个 map,我找不到一种方法,但这是两次进入列表。这是函数式编程的好习惯吗?
【问题讨论】:
标签: functional-programming elixir
我假设数据如下所示:
list = [
%{price: 1, order_details: "foo"},
%{price: 2, order_details: "bar"},
%{price: 3, order_details: "baz"},
]
您仍然可以将 reduce 与 sum 和 list 的元组一起用作累加器。
list
|> Enum.reduce({0, []}, fn x, {sum, list} ->
{sum + x.price, [x.order_details | list]}
end)
|> IO.inspect
输出:
{6, ["baz", "bar", "foo"]}
【讨论】:
@Dogbert 的回答也完全有效,在 Elixir (Enum.map_reduce/3) 中有一个用于执行 map-reduce 的内置函数:
list = [
%{price: 1, order_details: "foo"},
%{price: 2, order_details: "bar"},
%{price: 3, order_details: "baz"},
]
Enum.map_reduce(list, 0, fn(%{order_details: od, price: p}, acc) ->
{od, acc + p} # `od` is a mapper, `acc + p` is a reducer
end)
#⇒ {["foo", "bar", "baz"], 6}
【讨论】: