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

Ruby 获取在对象数组中具有最小值的哈希,ruby,Ruby,我有一个哈希数组,如下所示: objects = [ {:area => -30}, {:area => 20}, {:area => 30}] 如何获取哈希值,哪个区域较低,但总是大于0 我试过这个: objects.min_by { |el| (el[:area] if el[:area] > 0) } 但我猜,因为(if…)返回NIL,所以它不能与其他值进行比较。我该怎么做呢?我可能会这样做: objects = [ {:area => -30}, {:a

我有一个哈希数组,如下所示:

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}
objects.reject{|x| x[:area] <= 0}.min_by{|x| x[:area]}
objects.reject{| x | x[:area]我会用它来为您提供一种“map&reduce”功能

objects=[{:area=>-30},{:area=>20},{:area=>30}]
objects.inject(nil){result,item}item[:area]>0&&(result.nil?| item[:area] 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=[{:area=>-30},{:area=>20},{:area=>30}]
objects.inject(objects[0][:area]){result,item | item[:area]>0&&item[:area] 20
您可以使用inject:

objects.inject(nil) do |result, item|
  if item[:area] > 0 && (result.nil? || item[:area] < result[:area])
    item
  else
    result
  end
end
objects.inject(nil)do |结果,项|
如果项目[:区域]>0&(result.nil?| |项目[:区域]<结果[:区域])
项目
其他的
结果
结束
结束

Hommer,你可能需要考虑重新组织你的代码,这样你就不会面临这个问题。例如,也许你可以在计算之前获得<代码> {:区域=>(-30, 20, 30)},这样你就不会重复相同的密钥。
objects.inject(nil) do |result, item|
  if item[:area] > 0 && (result.nil? || item[:area] < result[:area])
    item
  else
    result
  end
end