Best way to convert strings to symbols in hash

前端 未结 30 2973
借酒劲吻你
借酒劲吻你 2020-11-27 09:30

What\'s the (fastest/cleanest/straightforward) way to convert all keys in a hash from strings to symbols in Ruby?

This would be handy when parsing YAML.



        
相关标签:
30条回答
  • 2020-11-27 10:00

    Here's a way to deep symbolize an object

    def symbolize(obj)
        return obj.inject({}){|memo,(k,v)| memo[k.to_sym] =  symbolize(v); memo} if obj.is_a? Hash
        return obj.inject([]){|memo,v    | memo           << symbolize(v); memo} if obj.is_a? Array
        return obj
    end
    
    0 讨论(0)
  • 2020-11-27 10:00

    If you would like vanilla ruby solution and as me do not have access to ActiveSupport here is deep symbolize solution (very similar to previous ones)

        def deep_convert(element)
          return element.collect { |e| deep_convert(e) } if element.is_a?(Array)
          return element.inject({}) { |sh,(k,v)| sh[k.to_sym] = deep_convert(v); sh } if element.is_a?(Hash)
          element
        end
    
    0 讨论(0)
  • 2020-11-27 10:02

    A modification to @igorsales answer

    class Object
      def deep_symbolize_keys
        return self.inject({}){|memo,(k,v)| memo[k.to_sym] = v.deep_symbolize_keys; memo} if self.is_a? Hash
        return self.inject([]){|memo,v    | memo           << v.deep_symbolize_keys; memo} if self.is_a? Array
        return self
      end
    end
    
    0 讨论(0)
  • 2020-11-27 10:03

    So many answers here, but the one method rails function is hash.symbolize_keys

    0 讨论(0)
  • 2020-11-27 10:04

    Here's a better method, if you're using Rails:

    params.symbolize_keys

    The end.

    If you're not, just rip off their code (it's also in the link):

    myhash.keys.each do |key|
      myhash[(key.to_sym rescue key) || key] = myhash.delete(key)
    end
    
    0 讨论(0)
  • 2020-11-27 10:04

    http://api.rubyonrails.org/classes/Hash.html#method-i-symbolize_keys

    hash = { 'name' => 'Rob', 'age' => '28' }
    hash.symbolize_keys
    # => { name: "Rob", age: "28" }
    
    0 讨论(0)
提交回复
热议问题