Мне нужно отсортировать список карты, используя значение карты.
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},
]
... или count
или name
. Как я могу это сделать?
Есть функция Enum.sort_by
, которая принимает list
, mapper
и sorter
. Следующий код делает свое дело:
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
, которая сортирует список в порядке возрастания.
@IgodDrozdov предоставил хорошее решение. Более простой: вы можете использовать Enum.sort/2
:
Enum.sort(list, &(&1.id < &2.id))
Второй аргумент должен определять бинарное отношение (например, sorter
в Enum.sort_by/3
)
Спасибо, что указали на преимущество Enum.sort
в производительности / скорости по сравнению с Enum.sort_by
. В нашем случае код тоже получается более компактным.
слишком заманчиво добавить эту ссылку stackoverflow.com/q/51787410/7852283, где вы можете видеть, что
Enum.sort_by
иEnum.sort
не являются эквивалентными вариантами в вопросе исполнения. Это помогло мне понять плюсыEnum.sort_by
.