【问题标题】:Group and count array by date in javascript在javascript中按日期对数组进行分组和计数
【发布时间】:2023-01-10 15:17:04
【问题描述】:

我在使用 javascript 对这些数据进行分组时遇到问题。刚刚开始我的职业生涯,使用纯 javascript 和 nodeJS 构建网站应用程序。

这是我使用 typeORM 的数据结果。

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 操作数组方面不太擅长,多年来一直在 PHP 中。

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    您可以使用 1 个 reduce 来做到这一点。但是我使用了 3 个不同的 reduce 函数

    1. 对于创建:

      let created = data.reduce((acc, curr) => {
        let key = curr.date_created;
        if (!acc[key]) {
          acc[key] = {
            date: key,
            count: 1
          };
        } else {
          acc[key].count++;
        }
        return acc;
      }, {});
      
      // convert the object to array
      created = Object.values(created); 
      
      //  sort data by date
      created.sort((a,b) => new Date(a.date) - new Date(b.date)); 
      
      console.log(created)
      1. 用于验证

      let validated = data.reduce((acc, curr) => {
        let key = curr.date_validated;
        if (!acc[key]) {
          acc[key] = {
            date: key,
            count: 1
          };
        } else {
          acc[key].count++;
        }
        return acc;
      }, {});
      
      // convert the object to array
      validated = Object.values(validated); 
      
      // remove the null value
      validated = validated.filter(val => val.date != null) 
      
      // sort the data by date
      validated.sort((a,b) => new Date(a.date) - new Date(b.date));

      3.对于提交

      let submitted = data.reduce((acc, curr) => {
        let key = curr.date_submitted;
        if (!acc[key]) {
          acc[key] = {
            date: key,
            count: 1
          };
        } else {
          acc[key].count++;
        }
        return acc;
      }, {});
      
      // convert the object to array
      submitted = Object.values(submitted); 
      
      // remove the null values
      submitted = submitted.filter(val => val.date != null) 
      
      //sort the data by date
      submitted.sort((a, b) => new Date(a.date) - new Date(b.date));

      如果您仍然遇到任何问题。请告诉我

    【讨论】:

      猜你喜欢
      • 2023-02-07
      • 2015-06-26
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多