如何使用 created_at 日期 Elixir 执行 Enum.sort_by 和搜索

Jun*_*ooq 3 elixir

我有这个数据,

[       
  %{
    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
  }
]
Run Code Online (Sandbox Code Playgroud)

我正在尝试根据不同的值对其进行排序。

 Enum.sort_by(data, &(&1.user_count), &Kernel.>=/2)
Run Code Online (Sandbox Code Playgroud)

整数和字符串,上面的表达式是有效的。

我试过整数值,我关心的是我们如何按日期排序?另外,我们可以搜索值吗?用like表情?仅用于nameand company_id,您将搜索查询作为gar.

  [%{
    company_id: "garlandconsultancy.com",
    created_at: "Wednesday, 20 Jun 2018  3:32 PM",
    name: "Garland",
    session_count: 1,
    user_count: 3
  }]
Run Code Online (Sandbox Code Playgroud)

. 所以所有那些类似于搜索查询的地图都被过滤了。

我试过这个

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

它也不起作用。任何帮助都会非常感激。

Chr*_*yer 6

最简单的方法是首先使用 Timex 之类的库解析所有日期时间字符串。

您可以使用指令解析日期以适合您的特定格式。

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

例如:

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

然后,您可以通过调用使用这些值对数据进行排序:

data 
|> Enum.sort_by(fn d -> d.created_at |> parse_timestamp() end, &Timex.before?/2)
Run Code Online (Sandbox Code Playgroud)