获取对象数组中具有最小值的哈希值

时间:2013-11-08 19:22:13

标签: ruby

我有一系列哈希看起来像这样:

objects = [ {:area => -30}, {:area => 20}, {:area => 30}]

我如何得到哪个区域较低的哈希但总是大于0

我试过这个:

objects.min_by { |el| (el[:area] if el[:area] > 0) }

但我想因为(如果......)返回NIL,它无法与其他值进行比较。我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

objects = [ {:area => -30}, {:area => 20}, {:area => 30}]
objects.select{|h| h[:area] > 0}.min_by{|h| h[:area] }
# => {:area=>20}

答案 1 :(得分:0)

我可能会这样做:

objects.reject{|x| x[:area] <= 0}.min_by{|x| x[:area]}

答案 2 :(得分:0)

我会使用#inject为您提供一种“地图和缩小”功能。

objects = [ {:area => -30}, {:area => 20}, {:area => 30}]
objects.inject(nil) { |result, item| item[:area] > 0 && (result.nil? || item[:area] < result) ? item[:area] : result }
# => 20

您可以通过设置值而不是nil作为第一个值(或一个大值)并跳过零来简化它。

objects = [ {:area => -30}, {:area => 20}, {:area => 30}]
objects.inject(objects[0][:area]) { |result, item| item[:area] > 0 && item[:area] < result ? item[:area] : result }
# => 20

答案 3 :(得分:0)

您可以使用注入:

objects.inject(nil) do |result, item|
  if item[:area] > 0 && (result.nil? || item[:area] < result[:area])
    item
  else
    result
  end
end