从字符串拆分生成树

时间:2016-06-22 18:41:43

标签: ruby dynamic data-structures tree dynamic-programming

我有一个字符串数组

["ana_ola_una",
"ana_ola_ina",
"ana_asta",
"ana_ena_ola", 
"ana_ena_cala",
"ana_ena_cina",
"ana_ena_cina_ula"] 

我需要将其重新格式化为哈希哈希值的散列,以使其成为树。预期结果将是:

{ana: 
    {
     ola: {
           una: {},
           ina: {}
          }, 
     asta: {},
     ena: {
           ola: {}, 
           cala:{},
           cina: 
                {
                ula: {}
                }
           }
     }
}

编辑:

我编辑此问题是因为我有一个相关的问题,最后我希望它采用这种格式的JSON。我该怎么办:

var tree = [
        {
            text: "Parent 1",
            nodes: [
                {
                    text: "Child 1",
                    nodes: [
                        {
                            text: "Grandchild 1"
                        },
                        {
                            text: "Grandchild 2"
                        }
                    ]
                },
                {
                    text: "Child 2"
                }
            ]
        },
        {
            text: "Parent 2"
        },
        {
            text: "Parent 3"
        },
        {
            text: "Parent 4"
        },
        {
            text: "Parent 5"
        }
    ];

2 个答案:

答案 0 :(得分:2)

arr = %w|ana_ola_una
  ana_ola_ina
  ana_asta
  ana_ena_ola
  ana_ena_cala
  ana_ena_cina
  ana_ena_cina_ula|

result = arr.each_with_object({}) do |s, memo|
  s.split('_').inject(memo) do |deep, k|
    deep[k.to_sym] ||= {}
  end 
end

答案 1 :(得分:2)

mudasobwa的答案很好,但是如果你使用的是Ruby 2.3+,这里有一个更简洁的选择:

arr = [
  "ana_ola_una",
  "ana_ola_ina",
  "ana_asta",
  "ana_ena_ola", 
  "ana_ena_cala",
  "ana_ena_cina",
  "ana_ena_cina_ula"
]

tree = Hash.new {|h,k| h[k] = Hash.new(&h.default_proc) }
arr.each {|str| tree.dig(*str.split(?_).map(&:to_sym)) }

p tree
# => { ana:
#      { ola:
#        { una: {},
#          ina: {}
#        },
#        asta: {},
#        ena:
#        { ola: {},
#          cala: {},
#          cina: { ula: {} }
#        }
#      }
#    }