如何执行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)