как сделать Enum.sort_by и выполнить поиск по дате создания эликсира - PullRequest
1 голос
/ 07 марта 2019

У меня есть эти данные,

[       
  %{
    company_id: "ocsc.ie",
    created_at: "Wednesday, 08 Mar 2017  6:14 AM",
    name: "O'Connor Sutton Cronin",
    session_count: 2,
    user_count: 8
  },
  %{
    company_id: "virtuspm.ie",
    created_at: "Tuesday, 10 Jul 2018  8:48 AM",
    name: "VIRTUS",
    session_count: 1,
    user_count: 7
  },
  %{
    company_id: "garlandconsultancy.com",
    created_at: "Wednesday, 20 Jun 2018  3:32 PM",
    name: "Garland",
    session_count: 1,
    user_count: 3
  },
  %{
    company_id: "protectorsecurity.co.uk",
    created_at: "Friday, 31 Aug 2018 11:03 AM",
    name: "Protector Security Group",
    session_count: 4,
    user_count: 9
  },
  %{
    company_id: "tcd.ie",
    created_at: "Wednesday, 01 Mar 2017  7:39 AM",
    name: "TCD",
    session_count: 4,
    user_count: 18
  }
]

Я пытаюсь отсортировать их по разным значениям.

 Enum.sort_by(data, &(&1.user_count), &Kernel.>=/2)

Целые и строковые значения оба, приведенное выше выражение работает.

Я пробовал целочисленные значения, меня беспокоит, как мы можем отсортировать по дате?Кроме того, мы можем искать через значения?с like выражением?только для name и company_id, где вы передаете поисковый запрос как gar.

  [%{
    company_id: "garlandconsultancy.com",
    created_at: "Wednesday, 20 Jun 2018  3:32 PM",
    name: "Garland",
    session_count: 1,
    user_count: 3
  }]

.Так что все эти карты, похожие на поисковые запросы, отфильтрованы.

Я пробовал это

Enum.filter(data, fn(x) -> String.match?(String.downcase(x.name), ~r/String.downcase("VIR")/) end)

Это тоже не работает. Любая помощь будет очень благодарна.

Ответы [ 2 ]

1 голос
/ 08 марта 2019

Самый простой способ, которым вы можете воспользоваться, это сначала сократить все строки даты и времени с помощью библиотеки, такой как Timex.

Вы можете сократить дату, используя директивы, чтобы соответствовать вашему конкретному формату.

def parse_timestamp(ts) do 
  Timex.parse!(ts, "{WDfull}, {0D} {Mshort} {YYYY}  {h12}:{m} {AM}")
end

Например:

iex(1)> parse_timestamp("Tuesday, 10 Jul 2018  8:48 AM")
~N[2018-07-10 08:48:00]

Затем вы можете использовать эти значения для сортировки ваших данных, вызвав:

data 
|> Enum.sort_by(fn d -> d.created_at |> parse_timestamp() end, &Timex.before?/2)
0 голосов
/ 07 марта 2019

Относительно вашего второго вопроса, вы должны интерполировать String.downcase("VIR")

Enum.filter(data, fn x ->
      to_find = String.downcase("VIR")
      String.match?(String.downcase(x.name), ~r/#{to_find}/)
    end)

В этом случае вы можете использовать String.contains?/2 вместо String.match?/2

Для сравнения времени используйте библиотеку Timex (как сказал в комментариях denis.peplin)

...