From: soprano Date: 2008-01-07T03:44:00+09:00 Subject: Re: add rankings to array? Great, thanks! On Jan 6, 11:15 am, Robert Klemme wrote: > Preparation: > > data = [ >    { :name => "A", :points => 30 }, >    { :name => "B", :points => 20 }, >    { :name => "C", :points => 10 }, >    { :name => "D", :points => 20 } > ] > > Here's one way: > > sorted = data.sort_by {|x| -x[:points]} > ranked = sorted.inject([0,1,nil,[]]) do |(rk, cn, lst, arr), x| >    tmp_lst = x[:points] > >    if tmp_lst == lst >      cn += 1 >    else >      rk += cn >      cn  = 1 >    end > >    [rk, cn, tmp_lst, arr << [rk, x]] > end.last > > And here's another: > > hashed = data.inject(Hash.new {|h,k| h[k] = []}) do |ha, x| >    ha[x[:points]] << x >    ha > end > sorted = hashed.sort_by {|k,v| -k} > ranked = sorted.inject([]) do |arr, (k,v)| >    rk = arr.size + 1 >    v.each {|x, idx| arr << [rk, x]} >    arr > end > > Have fun!