28

与えられた:

shipping_costs = {
  key1: 45,
  key2: 99,
  key3: nil,
  key4: 24
}

nil = 0 と仮定して、これらのキーの最大値を取得する最もクリーンな方法は何ですか?

Rails コンソールでストレートを実行するshipping_costs.values.maxと、次のようになります。

ArgumentError: comparison of Fixnum with nil failed

max を実行する前にこれらの nil をゼロに変換する最もクリーンな方法は?

4

6 に答える 6

43

本当に簡潔にしたい場合は、 shipping_costs.values.compact.max

このメソッドは、配列からcompactすべての値を削除します。nil

他の答えも良い考えです。ただし、数値に置き換えるのではなく、値を拒否したいと思います。nil0(または選択した値)がどこから来たのかを推測するよりも、配列に値のみが含まれていることを知っている方が良いと思います。

于 2012-11-09T23:56:05.253 に答える
33

私は行くだろう:

shipping_costs.values.map(&:to_i).max

nil.to_iです0

于 2012-11-09T23:52:42.597 に答える
7

maxsortブロックを取り、動作方法と同様に、比較を行うことができます。

[45, 99, nil, 24].max{ |a,b| (a || 0) <=> (b || 0) }
=> 99

また:

[45, 99, nil, 24].max{ |a,b| a.to_i <=> b.to_i }
=> 99

これにより、比較が行われる前に、必要な方法で値を強制することができます。

あなたの場合、shipping_costs.valuesは、比較する必要のある配列を返すので、次のようになります。

shipping_costs.values.max{ |a,b| a.to_i <=> b.to_i }
于 2012-11-10T02:46:32.740 に答える
4

行うshipping_costs.values.reject {|v| v.nil? }.max

于 2012-11-09T23:52:55.527 に答える