0

我有一个看起来像这样的哈希数组:

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

我如何获得哪个区域较低但始终大于 0的哈希值?

我试过这个:

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

但我想既然 (if.​​..) 返回 NIL,它就无法与其他值进行比较。我怎样才能做到这一点?

4

4 回答 4

1
objects = [ {:area => -30}, {:area => 20}, {:area => 30}]
objects.select{|h| h[:area] > 0}.min_by{|h| h[:area] }
# => {:area=>20}
于 2013-11-08T19:24:08.337 回答
0

我会使用#inject它为您提供一种“map & reduce”功能。

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 作为第一个值(或一个大值)并跳过 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
于 2013-11-08T19:28:12.383 回答
0

我可能会这样做:

objects.reject{|x| x[:area] <= 0}.min_by{|x| x[:area]}
于 2013-11-08T19:25:51.697 回答
0

你可以使用注入:

objects.inject(nil) do |result, item|
  if item[:area] > 0 && (result.nil? || item[:area] < result[:area])
    item
  else
    result
  end
end
于 2013-11-08T19:38:06.323 回答