【问题标题】:elixir how to map and reduce at the same time without going through the map twice长生不老药如何在不经过两次映射的情况下同时映射和减少
【发布时间】:2018-01-07 18:47:47
【问题描述】:

我有包含

的订单地图列表
%{price, order_details}

我想获得该订单中的 total_price,并且我还想返回使用该地图中每个元素的 order_details 构建的变更集数组。 如果不使用一个 reduce 和一个 map,我找不到一种方法,但这是两次进入列表。这是函数式编程的好习惯吗?

【问题讨论】:

标签: functional-programming elixir


【解决方案1】:

我假设数据如下所示:

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"]}

【讨论】:

    【解决方案2】:

    @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}
    

    【讨论】:

      猜你喜欢
      • 2021-10-14
      • 1970-01-01
      • 2023-04-03
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 2016-09-21
      • 2014-06-06
      相关资源
      最近更新 更多