0

以下を達成するための最良の方法は何ですか.ABCの下に次の一連のアクションがあります

ABC:-

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 

これを次のようにフォーマットしたい:

ABC =>{Actions=> [ADD-DATA,TRANSFER-DATA,EXPORT,PRINT], Detail => [Overview, Product-detail, event-log,orders]}

4

3 に答える 3

2

方法はたくさんあると思いますが、次の方法があります。

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"] }ます。次に、次の「分割」配列に進み、それも同じ方法でハッシュに追加します。

于 2013-06-18T17:31:28.780 に答える
1

group_byでそれを行うのはただ面白かったです:)

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']

result = a.map { |action| action.split(":") }.group_by(&:shift)
result.each do |k1,v1|
  result[k1] = v1.group_by(&:shift)
  result[k1].each { |k2,v2| result[k1][k2] = v2.flatten }
end 

p result 

{"ABC"=>{"Actions"=>["ADD-DATA", "TRANSFER-DATA", "EXPORT", "PRINT"], "Detail"=>["OVERVIEW", "PRODUCT-DETAIL", "EVENT-LOG", "ORDERS"]}}
于 2013-06-18T19:30:46.427 に答える