次のようなハッシュの配列があります。
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.reject{|x| x[:area] <= 0}.min_by{|x| x[:area]}
#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 の代わりに値を設定し、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