Ruby数组以日期作为键进行散列
我有一个如下所示的数组:Ruby数组以日期作为键进行散列,ruby,Ruby,我有一个如下所示的数组: [ ["20180630", "14:49", "google", "iOS", "Safari", "1"], ["20180630", "12:22", "google", "Android", "Chrome", "2"], ["20180629", "17:20", "google", "iOS", "Safari", "1"], ["20180629", "16:30", "(direct)", "iOS", "Safari", "1"],
[
["20180630", "14:49", "google", "iOS", "Safari", "1"],
["20180630", "12:22", "google", "Android", "Chrome", "2"],
["20180629", "17:20", "google", "iOS", "Safari", "1"],
["20180629", "16:30", "(direct)", "iOS", "Safari", "1"],
["20180629", "09:29", "(direct)", "Android", "Chrome", "2"]
]
我想要的输出是一个散列,其中日期作为键:
{
"20180630": [["14:49", "google", "iOS", "Safari", "1"],["12:22", "google", "Android", "Chrome", "2"]],
"20180629": [[...],[...],[...]]
}
Enumerable#group_by
将为您提供数组哈希转换,然后只需从结果值中删除冗余列即可:
hash = input_array.group_by(&:first)
hash.each { |_, list| list.each(&:shift) }
hash
(请注意,这会修改原始数组;如果出现问题,您需要调整到具有更多复制和更少变异的版本)以下是构建所需哈希的两种方法。两者都不会变异给定数组(
arr
)
如果您不关心保留原始数组,那么只需
input_array.group_by(&:shift)
如果您认为@Sergio的评论(用一行替换三行)代表了改进,我建议您相应地编辑您的答案,并在评论中感谢Sergio。如果你想让读者知道你以前有过什么,就在同一条评论中,而不是在答案中。我们的责任是读者,他们关心的不是归属,而是内容。我建议你像对待文章或书中的段落一样对待你的答案。当我读到你的答案时,我的直接反应是,“为什么移位
?”,这会修改接收者,而不是删除(1)
,后者不会?当询问者没有声明接收者将被变异时,我们应该假设它不会被触碰。您可以编写,hash.each{u124;,list{list.map{a}a.drop(1)}
,它比可爱的shift
代码多几个字符,但这是不相关的。或者:hash.transform_值{v| v.map{a | a.drop(1)}
,在Ruby v2.4中首次出现。@CarySwoveland,同时简化了(+1),我认为把分组和值的调整混为一谈对读者没有什么帮助。正如你的回答所示,这比s/shift/drop/
要复杂一点。你能展示一下你为解决这个问题而编写的代码吗?你有什么问题吗你写了什么代码来解决这个问题?
arr = [
["20180630", "14:49", "google", "iOS", "Safari", "1"],
["20180630", "12:22", "google", "Android", "Chrome", "2"],
["20180629", "17:20", "google", "iOS", "Safari", "1"],
["20180629", "16:30", "(direct)", "iOS", "Safari", "1"],
["20180629", "09:29", "(direct)", "Android", "Chrome", "2"]
]
arr.each_with_object({}) { |a,h| (h[a.first] ||= []) << a.drop(1) }
#=> {"20180630"=>[["14:49", "google", "iOS", "Safari", "1"],
# ["12:22", "google", "Android", "Chrome", "2"]],
# "20180629"=>[["17:20", "google", "iOS", "Safari", "1"],
# ["16:30", "(direct)", "iOS", "Safari", "1"],
# ["09:29", "(direct)", "Android", "Chrome", "2"]]}
arr.each_with_object(Hash.new { |h,k| h[k] = [] }) { |a,h| h[a.first] << a.drop(1) }
arr.each_with_object({}) { |a,h| h.update(a.first=>[a.drop(1)]) { |_,o,n| o+n } }