如何执行Enum.sort_by&;在日期Elixir使用创建的_搜索

如何执行Enum.sort_by&;在日期Elixir使用创建的_搜索,elixir,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,

我有这个数据,

[       
  %{
    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)
整数和字符串,上面的表达式正在工作

我尝试过整数值,我关心的是如何按日期排序? 另外,我们可以通过值进行搜索吗?用
表达式?仅用于
name
company\u 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)

它也不起作用。任何帮助都将非常感谢。

关于第二个问题,您必须插入
String.downcase(“VIR”)

在这种情况下,可以使用而不是
String.match?/2


要进行时间比较,请使用库(正如denis.peplin在评论中所说)

这是一种最简单的方法,您可以首先使用类似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)
虽然说明了Christophe在答案中已经写了什么,但这不起作用,因为它将抛出一个错误**(CaseClauseError)no case子句匹配::gt**

如果您面临相同的问题,则需要为:gt/:lt值显式调用true和false,如下所示

data
|> Enum.sort(fn map1, map2 -> 
  case DateTime.compare(map1[date_key], map2[date_key]) do
    :lt -> true
    _ -> false
  end
end)

这将按日期键的递增顺序对数据进行排序。此外,我还没有包括解析日期的步骤,您可以参考上面的书面答案。

用于日期时间排序,但首先将字符串转换为日期时间。请尝试Timex库进行datetime解析()。进行搜索?并等待其他答案进行搜索。您在此处发布了两个问题。如果您碰巧喜欢下面的答案,请将其标记为解决方案:)我的时间戳已解析,我正在使用代码
Enum.sort_by(data,&(&1[“created_at”]),&DateTime.compare(&1,&2))
,但这会引发一个错误(caseerror)no case子句匹配::gt我做错了什么?好的,我明白了。对于其他面临相同问题的人,我将最终解决方案作为另一个答案发布。实际上,您可以传递
DateTime
模块名称,而不是
fn
,elixir将自动使用其
比较
功能。因此,您不必自己强制转换为布尔值。
data
|> Enum.sort(fn map1, map2 -> 
  case DateTime.compare(map1[date_key], map2[date_key]) do
    :lt -> true
    _ -> false
  end
end)