You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript按日期分组统计TypeORM数据的创建、验证、提交量

按日期分组统计数组数据的JavaScript实现

问题描述

从PHP转型到JavaScript/Node.js开发,使用TypeORM获取到指定格式的数据集,需要按日期分组统计三个维度的数据:

  1. 每日创建的数据总量(基于date_created字段)
  2. 每日验证通过的数据量(仅统计validated为'1'的条目,基于date_validated字段)
  3. 每日提交通过的数据量(仅统计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);

代码说明

  1. 通用函数groupByDate:
    • reduce遍历数组,以日期为键累加计数,实现分组统计
    • 可选的filterFn参数用于筛选需要统计的条目,灵活适配不同维度的统计需求
  2. 格式转换与排序:
    • Object.entries将键值对对象转换为二维数组,再通过map转换为{date, count}的目标格式
    • sort通过日期对象的差值计算,实现日期的升序排序
  3. 调用逻辑:
    • 统计创建量时无需额外过滤,直接传入日期字段名即可
    • 统计验证/提交量时,传入对应的状态过滤条件,确保只统计符合要求的条目

内容的提问来源于stack exchange,提问作者p3ac3

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:01:15