在Ruby中将嵌套数组转换为嵌套哈希

时间:2013-03-06 09:56:01

标签: ruby arrays

在不知道数组维度的情况下,如何将数组转换为嵌套哈希?

例如:

[["Message", "hello"]]

为:

{{:message => "Hello"}}

或者:

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

为:

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

或:

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

为:

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

2 个答案:

答案 0 :(得分:1)

考虑到嵌套数组对的格式,后续函数将其转换为您想要的哈希

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

较短的版本

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

答案 1 :(得分:-1)

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

因此:

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