How to elegantly symbolize_keys for a 'nested' hash

后端 未结 6 2193
無奈伤痛
無奈伤痛 2021-02-06 20:46

Consider the following code:

  hash1 = {\"one\" => 1, \"two\" => 2, \"three\" => 3}
  hash2 = hash1.reduce({}){ |h, (k,v)| h.merge(k => hash1) }
  ha         


        
6条回答
  •  长发绾君心
    2021-02-06 21:24

    There are a few ways to do this

    1. There's a deep_symbolize_keys method in Rails

      hash.deep_symbolize_keys!

    2. As mentioned by @chrisgeeq, there is a deep_transform_keys method that's available from Rails 4.

      hash.deep_transform_keys(&:to_sym)

      There is also a bang ! version to replace the existing object.

    3. There is another method called with_indifferent_access. This allows you to access a hash with either a string or a symbol like how params are in the controller. This method doesn't have a bang counterpart.

      hash = hash.with_indifferent_access

    4. The last one is using JSON.parse. I personally don't like this because you're doing 2 transformations - hash to json then json to hash.

      JSON.parse(JSON[h], symbolize_names: true)

    UPDATE:

    16/01/19 - add more options and note deprecation of deep_symbolize_keys

    19/04/12 - remove deprecated note. only the implementation used in the method is deprecated, not the method itself.

提交回复
热议问题