module Enumerable def uniq_by(&block) uniq = {} each_with_index do |val, idx| key = block.call(val) uniq[key] = [idx, val] end values = uniq.values values.sort!{|a,b| a.first <=> b.first} values.map!{|pair| pair.last} values end end p [ [0,1], [0,2], [1,0], [1,2] ].uniq_by{|a| a.first} #=> [[0, 2], [1, 2]]