Ruby-哈希中按id排序和按日期分组
我一直在努力解决这个问题,但没有得到令人满意的结果。我有这个杂烩:Ruby-哈希中按id排序和按日期分组,ruby,sorting,hash,grouping,Ruby,Sorting,Hash,Grouping,我一直在努力解决这个问题,但没有得到令人满意的结果。我有这个杂烩: {"idprj"=>13351, "prevInicioStr"=>"21/10/2019"} {"idprj"=>14473, "prevInicioStr"=>"22/10/2019"} {"idprj"=>14165, "prevInicioStr"=>"23/10/2019"} {"idprj"=>14165, "prevInicioStr"=>"23/10/2019"}
{"idprj"=>13351, "prevInicioStr"=>"21/10/2019"}
{"idprj"=>14473, "prevInicioStr"=>"22/10/2019"}
{"idprj"=>14165, "prevInicioStr"=>"23/10/2019"}
{"idprj"=>14165, "prevInicioStr"=>"23/10/2019"}
{"idprj"=>14165, "prevInicioStr"=>"28/10/2019"}
{"idprj"=>14165, "prevInicioStr"=>"28/10/2019"}
{"idprj"=>14518, "prevInicioStr"=>"29/10/2019"}
{"idprj"=>14518, "prevInicioStr"=>"29/10/2019"}
{"idprj"=>13351, "prevInicioStr"=>"05/11/2019"}
{"idprj"=>14305, "prevInicioStr"=>"06/11/2019"}
{"idprj"=>14305, "prevInicioStr"=>"08/11/2019"}
{"idprj"=>14305, "prevInicioStr"=>"13/01/2020"}
我想按“prevInicioStr”排序,按“idprj”分组(您可以看到id 13351没有按应有的方式分组)。为了得到这个结果,我做了以下工作:
result.sort_by { |hash| [ Date.parse(hash['prevInicioStr']), hash['idprj'] ] }
您必须先分组,然后排序(实际上是对值排序):
看起来不错,只是按日期排序。使用类似于
.sort_by{e | e | Date.strtime(e['prevInicioStr'],'%d/%m/%Y')}的东西不是更好吗
那会很好,但我不知道是否需要它,因为p“05/11/2019”“21/10/2019”#-1;p“2019年10月21日”“2019年11月5日”第1页;p“2019年10月21日”“2019年10月21日”#0
。完成!只是删除了我代码中的键,只允许值,现在一切都好了@SebastianPalma在iso8601格式中不需要它,因为日期是以另一个方向表示的。目前,您正在按天、月、年进行排序。这意味着“01/01/2050”
位于“06/01/1850”
之前,因为“01”
小于“06”
。这是12个散列,而不是一个。你是说它是一个散列数组吗?如果是这样(即使您选择了答案),请编辑使其成为这样。此外,如果您将变量分配给数组(例如,arr=[{…},{…},{…},{…}]
),这样读者就可以在答案和注释中引用变量,而不必定义它,这也会很有帮助。另外,您为什么选择提供的第一个答案?你不想看到其他人吗?我选择回答,因为它符合我的需要,但嘿,欢迎大家也发表评论!
data = [{"idprj"=>13351, "prevInicioStr"=>"21/10/2019"}, {"idprj"=>14473, "prevInicioStr"=>"22/10/2019"}, {"idprj"=>14165, "prevInicioStr"=>"23/10/2019"}, {"idprj"=>14165, "prevInicioStr"=>"23/10/2019"}, {"idprj"=>14165, "prevInicioStr"=>"28/10/2019"}, {"idprj"=>14165, "prevInicioStr"=>"28/10/2019"}, {"idprj"=>14518, "prevInicioStr"=>"29/10/2019"}, {"idprj"=>14518, "prevInicioStr"=>"29/10/2019"}, {"idprj"=>13351, "prevInicioStr"=>"05/11/2019"}, {"idprj"=>14305, "prevInicioStr"=>"06/11/2019"}, {"idprj"=>14305, "prevInicioStr"=>"08/11/2019"}, {"idprj"=>14305, "prevInicioStr"=>"13/01/2020"}]
pp data.group_by { |e| e['idprj'] }
.transform_values { |values| values.sort_by { |e| e['prevInicioStr'] } }
# {13351=>
# [{"idprj"=>13351, "prevInicioStr"=>"05/11/2019"},
# {"idprj"=>13351, "prevInicioStr"=>"21/10/2019"}],
# 14473=>[{"idprj"=>14473, "prevInicioStr"=>"22/10/2019"}],
# 14165=>
# [{"idprj"=>14165, "prevInicioStr"=>"23/10/2019"},
# {"idprj"=>14165, "prevInicioStr"=>"23/10/2019"},
# {"idprj"=>14165, "prevInicioStr"=>"28/10/2019"},
# {"idprj"=>14165, "prevInicioStr"=>"28/10/2019"}],
# 14518=>
# [{"idprj"=>14518, "prevInicioStr"=>"29/10/2019"},
# {"idprj"=>14518, "prevInicioStr"=>"29/10/2019"}],
# 14305=>
# [{"idprj"=>14305, "prevInicioStr"=>"06/11/2019"},
# {"idprj"=>14305, "prevInicioStr"=>"08/11/2019"},
# {"idprj"=>14305, "prevInicioStr"=>"13/01/2020"}]}