ruby-on-rails - 使用以下结构在 ruby​​ 中将 Array 转换为 Hash

标签 ruby-on-rails ruby

我有一个以下数组,显示用户信息和一些与用户相关的值。以下数组包含两个用户 Akiyo Riggs 和 Bingo 的信息

a1 = [["Akiyo Riggs", -32, "OverTime Hours", "",12],["Akiyo Riggs", -32, 
"Regular Hours", "", 18],["Bingo",-12,"OverTime Hours","",14], ["Bingo",
-12,"Regular Hours","",32]]

我如何转换成以下哈希数组,其中键是用户名,值是具有相应值的哈希

[{"Akiyo Riggs"=>{"OverTime Hours"=>["", 12], "Regular Hours"=>["", 18]},
{"Bingo"=>{"OverTime Hours"=>["", 14], "Regular Hours"=>["", 32]}]

最佳答案

a1.map { |x,_,p,*ps| {x => {p => ps} } }.reduce({}, :deep_merge)
# => {"Akiyo Riggs"=>{"OverTime Hours"=>["", 12], "Regular Hours"=>["", 18]},
#     "Bingo"=>{"OverTime Hours"=>["", 14], "Regular Hours"=>["", 32]}}

注意:如果考虑效率,请考虑使用 deep_merge! 而不是 deep_merge,这样 reduce 就不会在每次迭代。

一些解释:

a1.map { |x,_,p,*ps| {x => {p => ps} } }

给我们一个像这样的散列数组

 [{"Akiyo Riggs"=>{"OverTime Hours"=>["", 12]}},
  {"Akiyo Riggs"=>{"Regular Hours"=>["", 18]}},
  {"Bingo"=>{"OverTime Hours"=>["", 14]}},
  {"Bingo"=>{"Regular Hours"=>["", 32]}}]

我们可以递归地与 ActiveSupport 合并 Hash#deep_merge

关于ruby-on-rails - 使用以下结构在 ruby​​ 中将 Array 转换为 Hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27357610/

相关文章:

ruby - 如何通过 Magento SOAP API 使用 savon gem

ruby-on-rails - 自动编译 Assets 并使用 nginx 提供服务(开发)

javascript - 设置 Disqus 话题作者

ruby - 如何检查 Chef 中是否存在文件夹?

python - 编写一个小而灵活的 HTTP 客户端

ruby-on-rails - 将 Whenever gem 与 Rails Active Job 一起使用来安排批处理电子邮件作业

ruby - PG Ruby Gem 在设置 PostgreSQL 连接时是否使用 pgpass?

ruby-on-rails - 如何使用 lookup_context 使此 View 尽可能干燥?

ruby-on-rails - 使用嵌套路由与 accepts_nested_attributes_for 有什么区别?

ruby-on-rails - 如何在 Rails 3 中强制对 HTML 电子邮件进行字符编码?