def group_by groups = [] inject({}) do |grouped, element| index = yield(element) if group = grouped[index] group << element else group = [element] groups << [index, group] grouped[index] = group end grouped end groups end if RUBY_VERSION < '1.9'