首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby数组转换的最佳方式

Ruby数组转换的最佳方式
EN

Stack Overflow用户
提问于 2013-06-19 00:55:14
回答 3查看 115关注 0票数 0

实现以下目标的最好方法是什么?我在ABC下有以下一系列操作

ABC:-

代码语言:javascript
复制
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]}

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-06-19 01:31:29

可能有很多方法可以做到这一点,但这里只有一种:

代码语言:javascript
复制
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" => {}。然后,它在散列中为第二个元素创建一个映射到一个空数组,例如"ABC" => { "Detail" => [] }。然后,它将第三个元素添加到该数组中,以获得类似"ABC" => { "Detail" => ["OVERVIEW"] }的内容。然后,它进入下一个“分割”数组,并以同样的方式将其添加到散列中。

票数 2
EN

Stack Overflow用户

发布于 2013-06-19 02:56:02

我将这样做:

代码语言:javascript
复制
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"]

m = a.map{|i| i.split(":")[1..-1]}
# => [["Actions"],
#     ["Actions", "ADD-DATA"],
#     ["Actions", "TRANSFER-DATA"],
#     ["Actions", "EXPORT"],
#     ["Actions", "PRINT"],
#     ["Detail"],
#     ["Detail", "OVERVIEW"],
#     ["Detail", "PRODUCT-DETAIL"],
#     ["Detail", "EVENT-LOG"],
#     ["Detail", "ORDERS"]]

m.each_with_object(Hash.new([])){|(i,j),ob| ob[i] = ob[i] + [j] unless j.nil? }
# => {"Actions"=>["ADD-DATA", "TRANSFER-DATA", "EXPORT", "PRINT"],
#     "Detail"=>["OVERVIEW", "PRODUCT-DETAIL", "EVENT-LOG", "ORDERS"]}
票数 1
EN

Stack Overflow用户

发布于 2013-06-19 03:30:46

用group_by做这件事很有趣:)

代码语言:javascript
复制
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"]}}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17174644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档