And here's the inevitable one-liner... :}

(But I do prefer the group_by version...)

gegroet,
Erik V. - http://www.erikveen.dds.nl/

----------------------------------------------------------------

 ################################################################

 arr = [
   {:id => 1, :w => 30},
   {:id => 2, :w => 20},
   {:id => 3, :w => 10},
   {:id => 1, :w => 10},
   {:id => 1, :w => 40},
   {:id => 2, :w => 50},
   {:id => 4, :w => 60},
   {:id => 4, :w => 30},
   {:id => 2, :w => 20},
   {:id => 3, :w => 10}
 ]

 ################################################################

 res1=arr.inject({}){|h,o|(h[o[:id]]||=[])<<o;h}.values.map{|a|
a.sort_by{|o|o[:w]}.pop}

 ################################################################

 res2 =
 arr.inject({}) do |h,o|
   (h[o[:id]] ||= []) << o ; h
 end.values.collect do |a|
   a.sort_by do |o|
     o[:w]
   end.pop
 end

 ################################################################

 module Enumerable
   def hash_by(&block)
     inject({}){|h, o| (h[block.call(o)] ||= []) << o ; h}
   end

   def group_by(&block)
     hash_by(&block).sort.transpose.pop
   end
 end

 res3 =
 arr.group_by do |o|
   o[:id]
 end.collect do |a|
   a.sort_by do |o|
     o[:w]
   end.pop
 end

 ################################################################

 p res1
 p res2
 p res3

 ################################################################

----------------------------------------------------------------