合并键,基于键值的值列表

时间:2021-03-02 08:37:10

标签: elixir

我有几个这样的键值列表

fans = [%{"end_time" => "2021-01-02T08:00:00+0000", "value" => 514210},
  %{"end_time" => "2021-01-03T08:00:00+0000", "value" => 513702},
  %{"end_time" => "2021-01-04T08:00:00+0000", "value" => 513720},
  %{"end_time" => "2021-01-05T08:00:00+0000", "value" => 513775}]

unique_weakly = [ %{"end_time" => "2021-01-02T08:00:00+0000", "value" => 846593},
  %{"end_time" => "2021-01-03T08:00:00+0000", "value" => 893488},
  %{"end_time" => "2021-01-04T08:00:00+0000", "value" => 1068204},
  %{"end_time" => "2021-01-05T08:00:00+0000", "value" => 1197864}]

unique_monthly = [  %{"end_time" => "2021-01-02T08:00:00+0000", "value" => 2660773},
  %{"end_time" => "2021-01-03T08:00:00+0000", "value" => 2641936},
  %{"end_time" => "2021-01-04T08:00:00+0000", "value" => 2632740},
  %{"end_time" => "2021-01-05T08:00:00+0000", "value" => 2632076}]

users_weakly = [  %{"end_time" => "2021-01-02T08:00:00+0000", "value" => 94173},
  %{"end_time" => "2021-01-03T08:00:00+0000", "value" => 104654},
  %{"end_time" => "2021-01-04T08:00:00+0000", "value" => 127377},
  %{"end_time" => "2021-01-05T08:00:00+0000", "value" => 144296}]

我想根据 end_time 合并它们,预期结果应该是

[%{end_time: "2021-01-02T08:00:00+0000",
   fans: 514210,
   unique_weakly: 846593,
   unique_monthly: 2660773,
   users_weakly: 94173},
 %{end_time: "2021-01-03T08:00:00+0000",
   fans: 513702,
   unique_weakly: 893488,
   unique_monthly: 2641936,
   users_weakly: 104654},
 ......]

有人能帮我理解如何做到这一点吗,谢谢?

1 个答案:

答案 0 :(得分:1)

你可以写一个这样的插入函数:

def insert(map, list, key) do
  Enum.reduce(list, map, fn %{"end_time" => end_time, "value" => value}, map ->
    Map.update(map, end_time, %{"end_time" => end_time, key => value}, &Map.put(&1, key, value))
  end)
end

然后像这样使用它:

%{}
|> insert(fans, "fans")
|> insert(unique_weakly, "unique_weakly")
|> insert(unique_monthly, "unique_monthly")
|> insert(users_weakly, "users_weakly")
|> Map.values()

结果:

[
  %{
    "end_time" => "2021-01-02T08:00:00+0000",
    "fans" => 514210,
    "unique_monthly" => 2660773,
    "unique_weakly" => 846593,
    "users_weakly" => 94173
  },
  %{
    "end_time" => "2021-01-03T08:00:00+0000",
    "fans" => 513702,
    "unique_monthly" => 2641936,
    "unique_weakly" => 893488,
    "users_weakly" => 104654
  },
  %{
    "end_time" => "2021-01-04T08:00:00+0000",
    "fans" => 513720,
    "unique_monthly" => 2632740,
    "unique_weakly" => 1068204,
    "users_weakly" => 127377
  },
  %{
    "end_time" => "2021-01-05T08:00:00+0000",
    "fans" => 513775,
    "unique_monthly" => 2632076,
    "unique_weakly" => 1197864,
    "users_weakly" => 144296
  }
]