JavaScript按日期分组统计TypeORM数据的创建、验证、提交量
按日期分组统计数组数据的JavaScript实现
问题描述
从PHP转型到JavaScript/Node.js开发,使用TypeORM获取到指定格式的数据集,需要按日期分组统计三个维度的数据:
- 每日创建的数据总量(基于
date_created字段) - 每日验证通过的数据量(仅统计
validated为'1'的条目,基于date_validated字段) - 每日提交通过的数据量(仅统计
submitted为'1'的条目,基于date_submitted字段)
最终结果需按日期升序排序,格式参考示例。
原始数据集
let data = [ { control_no: '01-55-10-021-000001', date_created: '2023-01-05', validated: '1', date_validated: '2023-01-06', submitted: '1', date_submitted: '2023-01-07' }, { control_no: '01-55-10-016-000190', date_created: '2023-01-05', validated: '1', date_validated: '2023-01-06', submitted: '0', date_submitted: null }, { control_no: '01-55-10-001-000001', date_created: '2023-01-06', validated: '0', date_validated: null, submitted: '0', date_submitted: null }, { control_no: '01-55-10-001-000002', date_created: '2023-01-06', validated: '0', date_validated: null, submitted: '0', date_submitted: null }, { control_no: '01-55-10-001-000003', date_created: '2023-01-06', validated: '0', date_validated: null, submitted: '0', date_submitted: null }, { control_no: '01-55-10-001-000004', date_created: '2023-01-06', validated: '1', date_validated: '2023-01-07', submitted: '1', date_submitted: '2023-01-08' }, { control_no: '01-55-10-001-000005', date_created: '2023-01-06', validated: '1', date_validated: '2023-01-07', submitted: '0', date_submitted: null }, { control_no: '01-55-10-001-000006', date_created: '2023-01-06', validated: '1', date_validated: '2023-01-07', submitted: '1', date_submitted: '2023-01-08' }, { control_no: '01-55-10-001-000007', date_created: '2023-01-09', validated: '0', date_validated: null, submitted: '0', date_submitted: null }, { control_no: '01-55-10-001-000008', date_created: '2023-01-09', validated: '0', date_validated: null, submitted: '0', date_submitted: null } ];
期望输出格式
// 每日创建总量 let created = [ { date: '2023-01-05', count: 2 }, { date: '2023-01-06', count: 6 }, { date: '2023-01-09', count: 2 } ]; // 每日验证通过量 let validated = [ { date: '2023-01-06', count: 2 }, { date: '2023-01-07', count: 3 } ]; // 每日提交通过量 let submitted = [ { date: '2023-01-07', count: 1 }, { date: '2023-01-08', count: 2 } ];
解决方案
通过封装通用分组统计函数,利用JavaScript数组的reduce方法完成分组计数,再转换为目标格式并排序:
// 通用分组统计函数:接收数据源、日期字段名、过滤条件(可选) function groupByDate(data, dateField, filterFn = () => true) { // 用reduce构建日期-计数的映射对象 const groupedMap = data.reduce((acc, item) => { // 跳过不满足过滤条件或日期为空的项 if (!filterFn(item) || !item[dateField]) return acc; const date = item[dateField]; acc[date] = (acc[date] || 0) + 1; return acc; }, {}); // 将映射对象转换为目标数组,并按日期升序排序 return Object.entries(groupedMap) .map(([date, count]) => ({ date, count })) .sort((a, b) => new Date(a.date) - new Date(b.date)); } // 统计每日创建总量 const created = groupByDate(data, 'date_created'); // 统计每日验证通过量:仅筛选validated为'1'的条目 const validated = groupByDate(data, 'date_validated', item => item.validated === '1'); // 统计每日提交通过量:仅筛选submitted为'1'的条目 const submitted = groupByDate(data, 'date_submitted', item => item.submitted === '1'); // 输出结果 console.log('created:', created); console.log('validated:', validated); console.log('submitted:', submitted);
代码说明
- 通用函数
groupByDate:reduce遍历数组,以日期为键累加计数,实现分组统计- 可选的
filterFn参数用于筛选需要统计的条目,灵活适配不同维度的统计需求
- 格式转换与排序:
Object.entries将键值对对象转换为二维数组,再通过map转换为{date, count}的目标格式sort通过日期对象的差值计算,实现日期的升序排序
- 调用逻辑:
- 统计创建量时无需额外过滤,直接传入日期字段名即可
- 统计验证/提交量时,传入对应的状态过滤条件,确保只统计符合要求的条目
内容的提问来源于stack exchange,提问作者p3ac3
相关产品推荐
相关产品推荐

