方法はたくさんあると思いますが、次の方法があります。
a = ["ABC:Actions",
"ABC:Actions:ADD-DATA",
"ABC:Actions:TRANSFER-DATA",
"ABC:Actions:EXPORT",
"ABC:Actions:PRINT",
"ABC:Detail",
"ABC:Detail:OVERVIEW",
"ABC:Detail:PRODUCT-DETAIL",
"ABC:Detail:EVENT-LOG",
"ABC:Detail:ORDERS"]
a.map { |action| action.split(":") }.inject({}) do |m, s|
m[s.at(0)] ||= {}
m[s.at(0)][s.at(1)] ||= [] if s.at(1)
m[s.at(0)][s.at(1)] << s.at(2) if s.at(2)
m
end
このmap
呼び出しは、元の配列の各文字列が で区切られた要素の配列に分割された配列を返します:
。例えば[["ABC","Actions","ADD-DATA"] ... ]
次に、inject
呼び出しは、これらの「分割された」配列のそれぞれを通過することによってハッシュを構築します。最初の要素がまだ存在しない場合は、空のハッシュへのマッピングを作成します"ABC" => {}
。次に、そのハッシュに 2 番目の要素のマッピングが作成されます。まだ存在しない場合は、空の配列へのマッピングが作成されます"ABC" => { "Detail" => [] }
。次に、その配列に 3 番目の要素を追加して、 のようにし"ABC" => { "Detail" => ["OVERVIEW"] }
ます。次に、次の「分割」配列に進み、それも同じ方法でハッシュに追加します。