Подтвердить что ты не робот

Rails: поиск максимального массива, который может содержать nil

Дано:

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

Какой самый чистый способ получить максимальный размер этих ключей при условии, что nil = 0?

Если я запускаю прямую shipping_costs.values.max в консоли Rails, я получаю следующее:

ArgumentError: comparison of Fixnum with nil failed

Самый чистый способ превратить эти нули в нули перед запуском max?

4b9b3361

Ответ 1

Я бы пошел за:

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

nil.to_i 0.

Ответ 2

Если вы хотите сохранить его очень кратким, вы можете использовать shipping_costs.values.compact.max

Метод compact удаляет из массива все значения nil.

Другие ответы также являются хорошими идеями. Однако я предпочел бы отказаться от значений вместо их замены числами. Я думаю, что лучше знать, что массив содержит только значения nil, чем угадывать, откуда взялось 0 (или любое другое значение).

Ответ 3

Никто не упомянул еще более короткую форму?

shipping_costs.values.max_by(&:to_i)

(Только информация)

Ответ 4

max берет блок, позволяя выполнить сравнение, аналогично тому, как работает sort:

[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 }

Ответ 5

Do shipping_costs.values.reject {|v| v.nil? }.max