简体   繁体   中英

Convert Nested Array into Nested Hash in Ruby

Without knowing the dimension of array, how do I convert an array to a nested hash?

For example:

[["Message", "hello"]]

to:

{{:message => "Hello"}}

Or:

[["Memory", [["Internal Memory", "32 GB"], ["Card Type", "MicroSD"]]]]

to:

{{:memory => {:internal_memroy => "32 GB", :card_type => "MicroSD"}}}

or:

[["Memory", [["Internal Memory", "32 GB"], ["Card Type", "MicroSD"]]], ["Size", [["Width", "12cm"], ["height", "20cm"]]]]

to:

{ {:memory => {:internal_memroy => "32 GB", :card_type => "MicroSD"}, {:size => {:width => "12cm", :height => "20cm" } } }

Considering your format of nested arrays of pairs, that following function transforms it into the hash you'd like

def nested_arrays_of_pairs_to_hash(array)
  result = {}
  array.each do |elem|
    second = if elem.last.is_a?(Array)
      nested_arrays_to_hash(elem.last)
    else
      elem.last
    end
    result.merge!({elem.first.to_sym => second})
  end
  result
end

A shorter version

def nested_arrays_to_hash(array)
  return array unless array.is_a? Array
  array.inject({}) do |result, (key, value)|
    result.merge!(key.to_sym => nested_arrays_to_hash(value))
  end
end
> [:Message => "hello"]
=> [{:Message=>"hello"}]

Thus:

> [:Message => "hello"][0]
=> {:Message=>"hello"}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM