在rails上的ruby中排序2d数组或哈希数组

时间:2014-03-10 14:57:08

标签: ruby-on-rails ruby arrays sorting

根据使排序更容易的原因,我可以拥有一个数组数组或一个哈希数组。 E.g。

我有id个和other fields like日期观看次数等。我可以用这种格式获取

[[1,"2014-01-01",50],[2,"2014-02-05",20],...][{:id=>1, :date=> "2014-01-01", :views=>50},{:id=>2,:date=>"2014-02-05",:views=>20}]

现在我需要能够对此进行排序或快速访问分钟/最大值。例如,在我看来,我想调用.max.views.min.views或smth来比较具有最高视图的条目和具有最低视图的条目。

ruby​​ sort_by方法确实令人困惑,我看不出我如何访问说最短日期或最近3个日期等。

2 个答案:

答案 0 :(得分:3)

很简单。您需要查看方法Enumerable#minmax_by

hash = [
         {:id=>1, :date=> "2014-01-01", :views=>50},
         {:id=>2,:date=>"2014-02-05",:views=>20}
       ]
min,max = hash.minmax_by { |h| h[:views] }
  

我如何访问说最小日期或最近3个日期等。

require 'date'

# the latest 3 dates
hash.sort_by { |h| Date.strptime(h[:date],"%Y-%m-%d") }.last(3)
# minimum date
hash.sort_by { |h| Date.strptime(h[:date],"%Y-%m-%d") }.first

答案 1 :(得分:1)

Min Max可以通过@ ArupRakshit的方法访问,并且可以使用sort_by方法获取“最短日期或最近3个日期”等内容

hash = [
     {:id=>1, :date=> "2014-01-01", :views=>50},
     {:id=>2,:date=>"2014-02-05",:views=>20}
     {:id=>3,:date=>"2014-02-10",:views=>100}
     {id:=>4, :date=>"2014-03-02",:views=>12}
   ]
hash.sort_by{|h| h[:views]}
#=>[{:id=>4, :date=>"2014-03-02", :views=>12}, {:id=>2, :date=>"2014-02-05", :views=>20}, {:id=>1, :date=>"2014-01-01", :views=>50}, {:id=>3, :date=>"2014-02-10", :views=>100}]

最短日期:

hash.sort_by{|h| h[:date]}.first
#=> {:id=>1, :date=> "2014-01-01", :views=>50}

最新3个日期:

hash.sort_by{|h| h[:date]}.slice(-3..-1)
#=>[{:id=>2, :date=>"2014-02-05", :views=>20}, {:id=>3, :date=>"2014-02-10", :views=>100}, {:id=>4, :date=>"2014-03-02", :views=>12}]