Ruby将数组数组转换为树结构

时间:2016-05-27 09:16:12

标签: arrays ruby hash nested

我有一个像这样的数组

[['Europe', 'UK', 'London'], ['Europe', 'UK', 'Bristol'], ['Europe', 'France']]

我想要转换它,所以我有一个嵌套的Hash结构,如下所示:

{"Europe"=>{"UK"=>["London", "Bristol"], "France"=>[]}} 

我还希望它以递归方式生成,因此每个数组中的元素数量不受限制。

实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:4)

我会从这样的事情开始:

arr = [['Europe', 'UK', 'London'], ['Europe', 'UK', 'Bristol'], ['Europe', 'France']]

arr.each.with_object({}) do |(region, country, city), hsh|
  hsh[region] ||= {}
  hsh[region][country] ||= []
  hsh[region][country] << city if city
end

# => {"Europe"=>{"UK"=>["London", "Bristol"], "France"=>[]}}

一些改进:

arr.each.with_object({}) do |args, hsh|
  target = hsh
  args.each { |key| target = target[key] ||= {} }
end
# => {"Europe"=>{"UK"=>{"London"=>{}, "Bristol"=>{}}, "France"=>{}}}