首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby数组group_by嵌套哈希和字段

Ruby数组group_by嵌套哈希和字段
EN

Stack Overflow用户
提问于 2012-04-26 21:25:19
回答 1查看 1.5K关注 0票数 0

Ruby on Rails 3.2.2、Ruby 1.9.3

我有来自Siz.requirements.all (模型)模型字段(siz,heigth,wigth,kol)的数组数据

代码语言:javascript
复制
[{:siz=>10, :heigth = 30, :wigth = 20, :kol = 24},
 {:siz=>10, :heigth = 30, :wigth = 10, :kol = 24},
 {:siz=>10, :heigth = 30, :wigth = 20, :kol = 33},
 {:siz=>10, :heigth = 20, :wigth = 20, :kol = 3},
 {:siz=>10, :heigth = 20, :wigth = 20, :kol = 5},...

如何使用group by字段创建数组或哈希,例如:

代码语言:javascript
复制
[{:siz=>10 => {:heigth=>"30" => {:wigth=>"20" => {:sum_kol => sum(kol)}}},         
{:siz=>10 => {:heigth=>"30" => {:wigth=>"10" => {:sum_kol => sum(kol)}}},
{:siz=>10 => {:heigth=>"20" => {:wigth=>"20" => {:sum_kol => sum(kol)}}}]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-27 00:48:06

如果这来自数据库,我会考虑使用数据库为您进行分组和汇总。但在Ruby中有一种方法可以做到:

代码语言:javascript
复制
raw_data = [ {:siz=>10, :heigth => 30, :wigth =>20, :kol =>24},
             {:siz=>10, :heigth =>30, :wigth =>10, :kol =>24},
             {:siz=>10, :heigth =>30, :wigth =>20, :kol =>33},
             {:siz=>10, :heigth =>20, :wigth =>20, :kol =>3},
             {:siz=>10, :heigth =>20, :wigth =>20, :kol =>5} ]

# create a hash that defaults to three levels of nested hash values,
# with 0s at the leaves
summary = Hash.new do Hash.new do Hash.new do 0 end end end    

# populate it
raw_data.each do |rec|
  size, height, width, col = rec.values_at(:siz,:heigth,:wigth,:kol)
  summary[size][height][width] += col
end

summary # => {10=>{30=>{20=>57, 10=>24}, 20=>{20=>8}}}

通常,在Ruby中使用inject/reduce而不是初始化+更新循环会更惯用:

代码语言:javascript
复制
summary = raw_data.reduce(Hash.new do Hash.new do Hash.new do 0 end end end)
 do |summary,rec|
   size, height, width, col = rec.values_at(:siz,:heigth,:wigth,:kol)
   summary[size][height][width] += col
   summary
end

但是,由于使用了默认的散列,并且需要在reduce块的末尾返回散列,我认为原始版本在这里更清晰。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10334402

复制
相关文章

相似问题

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