首页 > 解决方案 > 根据日期字段组织数组

问题描述

我正在开发一个前端带有 vue 的 Rails 应用程序。我有以下数据如下

records = [["2020-07-01", "Jamie", 66],
   ["2020-07-01", "Rob", 12],
   ["2020-08-01", "Jamie", 31],      
   ["2020-09-01", "Jamie", 46],
   ["2020-09-01", "Rob", 10],
   ["2020-10-01", "Rob", 4]]

我想将这些数据组织为

final_result = [{:name=>"Jamie", :data=>[66, 31, 46, 0]},
 {:name=>"Rob", :data=>[12, 0, 10, 4]}] 

我正在考虑使用 .map 之类的 records.map 但我无法弄清楚如何组合数据字段中的值

就像在 final_result 中一样,我根据以下日期将 Jamie 的值 66、31、46、0 和 Rob 的值 12、0、10、4 组合起来:7 月、8 月、9 月、10 月。

如果该值在任何月份都不存在,则将其设置为 0。请帮助我解决此问题。

更新 1

答案不适用于以下数据集

records = [
   ["2020-01-01", nil, nil, 0],
   ["2020-02-01", nil, nil, 0],
   ["2020-03-01", nil, nil, 0],
   ["2020-04-01", nil, nil, 0],
   ["2020-05-01", nil, nil, 0],
   ["2020-06-01", nil, nil, 0],
   ["2020-07-01", 2, "Jamie", 66],
   ["2020-07-01", 7, "Rob", 1],
   ["2020-08-01", 2, "Jamie", 29],
   ["2020-08-01", 7, "Rob", 2]]

在关于输出的情况下应该是

[{:name=>"Jamie", :data=>[0, 0, 0, 0, 0, 0, 66, 29]},
 {:name=>"Rob", :data=>[0, 0, 0, 0, 0, 0, 1, 2]}]

但根据答案

输出是

[{:name=>"Jamie", :data=>[0, 0, 0, 0, nil, nil, 66, 29]},
 {:name=>"Rob", :data=>[0, 0, 0, 0, nil, nil, 1, 2]}]

我无法弄清楚为什么它显示零值而不是零。

标签: ruby-on-railspostgresql

解决方案


records = [["2020-07-01", "Jamie", 66],
   ["2020-07-01", "Rob", 12],
   ["2020-08-01", "Jamie", 31],      
   ["2020-09-01", "Jamie", 46],
   ["2020-09-01", "Rob", 10],
   ["2020-10-01", "Rob", 4]]

months = records.map { |record| Date.parse(record.first, '').month }.uniq.sort
result = []
result_hash = records.inject({}) do |memo, record|
  memo[record.second] ||= Array.new(4).map { |_| 0 }
  memo[record.second][Date.parse(record.first).month - months.first] = record.last
  memo
end
result_hash.each { |key, value|  result << { name: key, data: value }}
p result

=>

[{:name=>"Jamie", :data=>[66, 31, 46, 0]}, {:name=>"Rob", :data=>[12, 0, 10, 4]}]

推荐阅读