我有一个看起来像这样的哈希数组:
objects = [ {:area => -30}, {:area => 20}, {:area => 30}]
我如何获得哪个区域较低但始终大于 0的哈希值?
我试过这个:
objects.min_by { |el| (el[:area] if el[:area] > 0) }
但我想既然 (if...) 返回 NIL,它就无法与其他值进行比较。我怎样才能做到这一点?
我有一个看起来像这样的哈希数组:
objects = [ {:area => -30}, {:area => 20}, {:area => 30}]
我如何获得哪个区域较低但始终大于 0的哈希值?
我试过这个:
objects.min_by { |el| (el[:area] if el[:area] > 0) }
但我想既然 (if...) 返回 NIL,它就无法与其他值进行比较。我怎样才能做到这一点?
objects = [ {:area => -30}, {:area => 20}, {:area => 30}]
objects.select{|h| h[:area] > 0}.min_by{|h| h[:area] }
# => {:area=>20}
我会使用#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
我可能会这样做:
objects.reject{|x| x[:area] <= 0}.min_by{|x| x[:area]}
你可以使用注入:
objects.inject(nil) do |result, item|
if item[:area] > 0 && (result.nil? || item[:area] < result[:area])
item
else
result
end
end