2016-07-14 120 views
2

我创建了一个简单的分析图表,并避免实时大量查询我需要将表中的结果数据集保存在专用于这些统计数据的表中。红宝石:地图数组哈希在哈希中创建数组

任何用户尝试一些课程,我想使用状态保存课程的ID。因此,像

{ "invited": [1,3,6], "done": [2,9] } 

我写这个功能

u.courses.map { |w| [w.status, []<<w.id] }.to_h 

但当然每一次迭代我的数组初始化,所以我有

{"invited"=>[5101]} 

,如果我试图用

u.courses.map { |w| [w.status, []<<w.id] } 

我获得

[["invited", [1]], ["invited", [748]], ["invited", [1445]], ["invited", [2113]], ["invited", [2833]], ["invited", [6017]], ["invited", [4146]], ["invited", [5101]]] 

如何在第一次迭代时创建数组并将其保存在我的地图中?

+0

请阅读“[mcve]”。我们需要演示问题的最小代码,相关的最小输入和您的预期输出。我们不知道'你'是什么,也不知道'课程'。我们可以猜测,但我们不应该,你应该告诉我们。 –

回答

2

可以尝试each_with_object

u.courses.each_with_object({}){|w, o| (o[w.status] ||= []) << w.id} 

reduce/inject

u.courses.reduce({}){|o, w| (o[w.status] ||= []) << w.id} 
0
u.course.each_with_object({}) { |course, h| 
    h.update(course.status=>[course.id]) { |_,o,n| o+n } } 

这使用的Hash#update(又名merge!)的形式,其使用一个块({ |_,o,n| o+n })以确定这些值两个哈希中存在的键合并。第一个块变量是公共密钥。由于没有在块计算中使用,所以我用一个下划线表示它,这是常见的做法。有关其他两个块变量的说明,请参阅文档update