如何使用散列数组输出动态 table
How to output a dynamic table with an array of hashes
这两天把我逼疯了。
{{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-01"}=>{:count=>5},
{:id=>2, :name=>"Allen, John", :completed_at=>"2020-03-01"}=>{:count=>6},
{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-03"}=>{:count=>6},
{:id=>3, :name=>"Davis, Carl", :completed_at=>"2020-03-04"}=>{:count=>10}}
我有从 ActiveRecord 查询中获得的数据,并以我计算用户每天完成的任务的方式进行映射。用户基本上选择月份和年份,例如2020年3月,从月初到月底统计每个用户的任务。
我想用它实现的是 table 看起来像我在下面上传的图片:
Table
我已经尝试了多种方法,例如将名称和日期放入一个完全独立的数组中并尝试根据条件输出,但我似乎无法让它工作。请注意,table headers 是基于给定日期的动态值。任何帮助将不胜感激!
所以,你可以那样做(这只是一个例子,让它适合你的需要)
obj = {
{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-01"}=>{:count=>5},
{:id=>2, :name=>"Allen, John", :completed_at=>"2020-03-01"}=>{:count=>6},
{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-03"}=>{:count=>6},
{:id=>3, :name=>"Davis, Carl", :completed_at=>"2020-03-04"}=>{:count=>10}
}
columns = obj.map { |k, _v| k[:completed_at] }.uniq
strokes = obj.map { |k, _v| { id: k[:id], name: k[:name] } }.uniq
result = []
result.push('name')
columns.each do |c|
result.push(c)
end
strokes.each do |stroke|
result.push(s[:name])
columns.each do |column|
cell = obj.find do |k, _v|
k[:id] == stroke[:id] && k[:completed_at] == column
end
result.push(cell&.last.try(:[], :count))
end
end
结果将是
[
"name", "2020-03-01", "2020-03-03", "2020-03-04",
"Brown, James", 5, 6, nil,
"Allen, John", 6, nil, nil,
"Davis, Carl", nil, nil, 10
]
这两天把我逼疯了。
{{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-01"}=>{:count=>5},
{:id=>2, :name=>"Allen, John", :completed_at=>"2020-03-01"}=>{:count=>6},
{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-03"}=>{:count=>6},
{:id=>3, :name=>"Davis, Carl", :completed_at=>"2020-03-04"}=>{:count=>10}}
我有从 ActiveRecord 查询中获得的数据,并以我计算用户每天完成的任务的方式进行映射。用户基本上选择月份和年份,例如2020年3月,从月初到月底统计每个用户的任务。
我想用它实现的是 table 看起来像我在下面上传的图片:
Table
我已经尝试了多种方法,例如将名称和日期放入一个完全独立的数组中并尝试根据条件输出,但我似乎无法让它工作。请注意,table headers 是基于给定日期的动态值。任何帮助将不胜感激!
所以,你可以那样做(这只是一个例子,让它适合你的需要)
obj = {
{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-01"}=>{:count=>5},
{:id=>2, :name=>"Allen, John", :completed_at=>"2020-03-01"}=>{:count=>6},
{:id=>1, :name=>"Brown, James", :completed_at=>"2020-03-03"}=>{:count=>6},
{:id=>3, :name=>"Davis, Carl", :completed_at=>"2020-03-04"}=>{:count=>10}
}
columns = obj.map { |k, _v| k[:completed_at] }.uniq
strokes = obj.map { |k, _v| { id: k[:id], name: k[:name] } }.uniq
result = []
result.push('name')
columns.each do |c|
result.push(c)
end
strokes.each do |stroke|
result.push(s[:name])
columns.each do |column|
cell = obj.find do |k, _v|
k[:id] == stroke[:id] && k[:completed_at] == column
end
result.push(cell&.last.try(:[], :count))
end
end
结果将是
[
"name", "2020-03-01", "2020-03-03", "2020-03-04",
"Brown, James", 5, 6, nil,
"Allen, John", 6, nil, nil,
"Davis, Carl", nil, nil, 10
]