递归地将所有数字字符串转换为Ruby哈希中的整数

And*_*huk 5 ruby hash

我有一个随机大小的哈希,它可能有像"100"我想要转换为整数的值.我知道我可以使用这个value.to_i if value.to_i.to_s == value,但我不确定如何在哈希中递归执行,考虑到值可以是字符串,也可以是数组(哈希或字符串)或其他哈希值.

Jor*_*ing 10

这是一个非常简单的递归实现(虽然必须处理数组和哈希增加了一点技巧).

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
Run Code Online (Sandbox Code Playgroud)

而且,嘿,它甚至有效:

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=>{}}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,那行得通。但是,我不得不将第一个 if 更改为 `if obj.respond_to? :to_i 和 obj.to_i.to_s == obj` 因为我的哈希也可以包含字母字符串。您可以相应地编辑您的答案。再次感谢! (2认同)
  • `obj.merge(obj){| k,val | fixnumify val}`=>`哈希[obj.map {| k,v | [k,fixnumify(val)]`?只是预感它可以更快. (2认同)