Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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-哈希中按id排序和按日期分组_Ruby_Sorting_Hash_Grouping - Fatal编程技术网

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