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

Dmi*_*nko 6 elixir

我需要使用map的值来排序地图列表.

list = [
  %{id: 3, name: "Abe", count: 50},
  %{id: 1, name: "Bill", count: 10},
  %{id: 2, name: "Candy", count: 2},
]
Run Code Online (Sandbox Code Playgroud)

例如,我需要按以下顺序排序id:

list = [
  %{id: 1, name: "Bill", count: 10},
  %{id: 2, name: "Candy", count: 2},
  %{id: 3, name: "Abe", count: 50},
]
Run Code Online (Sandbox Code Playgroud)

......或者countname.我怎么能这样做?

Igo*_*dov 7

Enum.sort_by功能,接受list,mappersorter.以下代码可以解决问题:

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)
Run Code Online (Sandbox Code Playgroud)

我们需要提供list一个返回映射属性的函数.Map.fetch(&1, :id)按键返回值,甚至更简单:

Enum.sort_by list, & &1.id
Run Code Online (Sandbox Code Playgroud)

sorter默认情况下是<=/2函数,它按asc顺序对列表进行排序.

  • 添加此链接 /sf/ask/3625118731/ 太诱人了,您可以在其中看到“Enum.sort_by”和“Enum.sort”在性能方面并不是等效的选择。它帮助我理解了“Enum.sort_by”的附加值。 (2认同)

Nat*_*ert 7

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

Enum.sort(list, &(&1.id < &2.id))
Run Code Online (Sandbox Code Playgroud)

第二参数必须定义一个二元关系(如sorterEnum.sort_by/3