Ruby on rails 如果有多个具有相同最大值,则将最大值作为数组获取

Ruby on rails 如果有多个具有相同最大值,则将最大值作为数组获取,ruby-on-rails,ruby,max,Ruby On Rails,Ruby,Max,Ruby有Enumerable#max和Enumerable#max_by,我以以下方式使用max_by array = [ {:a => 1, :b => 2, :c => 3}, {:a => 3, :b => 2, :c => 4}, {:a => 3, :b => 1, :c => 4} ] max_item = array.max_by { |it

Ruby有
Enumerable#max
Enumerable#max_by
,我以以下方式使用
max_by

array = [
           {:a => 1, :b => 2, :c => 3}, 
           {:a => 3, :b => 2, :c => 4}, 
           {:a => 3, :b => 1, :c => 4}
        ]
max_item = array.max_by { |item| item[:b] }
=> {:b=>2, :c=>3, :a=>1}

因此,它将返回一个最大值(我认为是第一个),即使有两个项目具有相同的最大值。我想实现一个函数,在这种情况下给出这两个项。是否有其他的
max_by
变体,或者我需要从头开始写吗?

据我所知,没有这样的方法。但是,下面应该可以(我将它添加到
数组中
,只是因为我在
irb中工作
-您可以在最有意义的地方对它进行猴子补丁)


groupby
的工作有点太难了,但它确实可以实现。

您为每个元素+1调用了两次
block
(这可能是一个昂贵的操作),
groupby
绝对是更好的解决方案。不知道
groupby
;很好。我知道
groupby
,但无法思考这个逻辑。我不得不读了两遍这篇文章才能得到逻辑。太棒了!!
class Array
  def maxes_by &block
    max_condition = block.call(max_by(&block))
    select {|it| block.call(it) == max_condition}
  end
end

array = [
           {:a => 1, :b => 2, :c => 3}, 
           {:a => 3, :b => 2, :c => 4}, 
           {:a => 3, :b => 1, :c => 4}
        ]
array.maxes_by{|it| it[:b]}
# => [{:a=>1, :b=>2, :c=>3}, {:a=>3, :b=>2, :c=>4}]
array = [
           {:a => 1, :b => 2, :c => 3}, 
           {:a => 3, :b => 2, :c => 4}, 
           {:a => 3, :b => 1, :c => 4}
        ]

array.group_by{|el| el[:b]}.max.last 
#=>[{:a=>1, :b=>2, :c=>3}, {:a=>3, :b=>2, :c=>4}]