我有一个随机大小的哈希表,其中可能有像"100"
这样的值,我想将它们转换成整数。我知道可以使用value.to_i if value.to_i.to_s == value
来实现这一点,但我不确定如何在我的哈希表中递归地执行此操作,因为值既可以是字符串,也可以是数组(哈希表或字符串)或另一个哈希表。
这是一个相当简单的递归实现(尽管必须处理数组和哈希表,这增加了一些复杂性)。
def fixnumify obj
if obj.respond_to? :to_i
# If we can cast it to a Fixnum, do it.
obj.to_i
elsif obj.is_a? Array
# If it's an Array, use Enumerable#map to recursively call this method
# on each item.
obj.map {|item| fixnumify item }
elsif obj.is_a? Hash
# If it's a Hash, recursively call this method on each value.
obj.merge( obj ) {|k, val| fixnumify val }
else
# If for some reason we run into something else, just return
# it unmodified; alternatively you could throw an exception.
obj
end
end
嘿,它甚至可以工作:
hsh = { :a => '1',
:b => '2',
:c => { :d => '3',
:e => [ 4, '5', { :f => '6' } ]
},
:g => 7,
:h => [],
:i => {}
}
fixnumify hsh
# => {:a=>1, :b=>2, :c=>{:d=>3, :e=>[4, 5, {:f=>6}]}, :g=>7, :h=>[], :i=>{}}
if obj.respond_to? :to_i and obj.to_i.to_s == obj
,因为我的哈希表中也可能包含字母字符串。你可以相应地编辑你的答案。再次感谢! - Andrii Yurchukobj.merge( obj ) {|k, val| fixnumify val }
=> Hash[obj.map{ |k, v| [k, fixnumify(val)]
?我有一种预感它可以更快。 - Victor MorozHash[]
。谢谢! - Jordan Runningmodule Helpers
class Number
class << self
def convert(object)
case object
when String
begin
numeric(object)
rescue StandardError
object
end
when Array
object.map { |i| convert i }
when Hash
object.merge(object) { |_k, v| convert v }
else
object
end
end # convert
private
def numeric(object)
Integer(object)
rescue
Float(object)
end # numeric
end # << self
end # Number
end # Helpers
Helpers::Number.convert [{a: ["1", "22sd"]}, 2, ['1.3', {b: "c"}]]
#=> [{:a=>[1, "22sd"]}, 2, [1.3, {:b=>"c"}]]
#is_kind_of?
的递归。 - Sergio Tulentsevobj.to_i.to_s == obj
看起来很奇怪。同一个整数值可能有不同的字符串表示,例如 "1_000_000" 或者 "019"。 - undur_gongor