Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby数组以日期作为键进行散列_Ruby - Fatal编程技术网

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 } }