如何在Elixir中按地图值对地图列表进行排序?

时间:2018-08-09 04:10:01

标签: elixir

我需要使用地图的值对地图列表进行排序。

list = [
  %{id: 3, name: "Abe", count: 50},
  %{id: 1, name: "Bill", count: 10},
  %{id: 2, name: "Candy", count: 2},
]

例如,我需要按id排序的列表:

list = [
  %{id: 1, name: "Bill", count: 10},
  %{id: 2, name: "Candy", count: 2},
  %{id: 3, name: "Abe", count: 50},
]

...或countname。我该怎么办?

2 个答案:

答案 0 :(得分:7)

Enum.sort_by函数,该函数接受listmappersorter。以下代码可以解决问题:

list = [
  %{id: 3, name: "Abe", count: 50},
  %{id: 1, name: "Bill", count: 10},
  %{id: 2, name: "Candy", count: 2},
]

Enum.sort_by list, &Map.fetch(&1, :id)

我们需要提供list和一个返回映射属性的函数。 Map.fetch(&1, :id)通过键或更简单地返回值:

Enum.sort_by list, & &1.id

sorter默认为<=/2函数,该函数以升序对列表进行排序。

答案 1 :(得分:4)

@IgodDrozdov提供了一个很好的解决方案。一个更基本的方法:您可以使用Enum.sort/2

Enum.sort(list, &(&1.id < &2.id))

第二个参数必须定义一个二进制关系(例如Enum.sort_by/3中的sorter