首页 > 解决方案 > 使用moment和lodash按月和周进行数据聚合 - Javascript

问题描述

我想按月和按周汇总数据。

我已经为它编写了一个函数,如下所示

  const groupTimelineData = (elements: any[], type: any) => {
    let groupedResults = _.groupBy(elements, (result: any) =>
      moment(result.date, "DD/MM/YYYY").startOf(type)
    );

    let z: any[] = [];

    _.values(groupedResults).forEach((arr: any, i) =>
      z.push(
        arr.reduce((a: any, b: any) => ({
          date: i + 1,
          type1: a.type1 + b.type1,
          type2: a.type2 + b.type2,
          type3: a.type3 + b.type3
        }))
      )
    );

    return z;
  };

我正在传递数据和类型(“isoWeek”或“month”)

但我没有得到想要的结果,我得到的月份数据长度为 19,这是不正确的。

我的数据结构是

  {
    date: "26/07/2021",
    type1: 215,
    type2: 1541,
    type3: 97
  },

我想汇总 type1、type2、type3 的总和。

例子:

一个月的输出应该如下所示

  {
    month: "January",
    type1: "total of type1",
    type2: "total of type1",
    type3: "total of type1"
  },

一周的输出应该如下所示

  {
    week: "week number",
    type1: "total of type1",
    type2: "total of type1",
    type3: "total of type1"
  },

这是codeandbox链接

https://codesandbox.io/s/aggregation-xpg70?file=/src/App.tsx

我没有得到我做错的地方

标签: javascriptmomentjslodash

解决方案


我删除了 lodash 因为在这种情况下没用,结果如下:

const data = [
  { date: '01/01/2020', type1: 264, type2: 1937, type3: 30 },
  { date: '02/01/2020', type1: 353, type2: 703, type3: 31 },
  { date: '03/01/2020', type1: 399, type2: 894, type3: 24 },
  { date: '04/01/2020', type1: 181, type2: 1775, type3: 24 },
  { date: '05/01/2020', type1: 379, type2: 685, type3: 31 },
  { date: '06/01/2020', type1: 204, type2: 151, type3: 34 },
  { date: '07/01/2020', type1: 350, type2: 1881, type3: 16 },
  { date: '08/01/2020', type1: 149, type2: 1614, type3: 23 },
  { date: '09/01/2020', type1: 402, type2: 258, type3: 14 },
  { date: '10/01/2020', type1: 130, type2: 835, type3: 27 },
  { date: '11/01/2020', type1: 278, type2: 318, type3: 21 },
  { date: '12/01/2020', type1: 352, type2: 1599, type3: 18 },
  { date: '13/01/2020', type1: 301, type2: 1326, type3: 15 },
  { date: '14/01/2020', type1: 207, type2: 1513, type3: 20 },
  { date: '15/01/2020', type1: 338, type2: 1541, type3: 25 },
  { date: '16/01/2020', type1: 375, type2: 238, type3: 14 },
  { date: '17/01/2020', type1: 131, type2: 663, type3: 25 },
  { date: '18/01/2020', type1: 387, type2: 628, type3: 32 },
  { date: '19/01/2020', type1: 97, type2: 591, type3: 48 },
  { date: '20/01/2020', type1: 218, type2: 1063, type3: 26 },
  { date: '21/01/2020', type1: 448, type2: 814, type3: 12 },
  { date: '22/01/2020', type1: 158, type2: 987, type3: 18 },
  { date: '23/01/2020', type1: 205, type2: 1035, type3: 13 },
  { date: '24/01/2020', type1: 47, type2: 1988, type3: 12 },
  { date: '25/01/2020', type1: 375, type2: 1348, type3: 17 },
  { date: '26/01/2020', type1: 419, type2: 636, type3: 31 },
  { date: '27/01/2020', type1: 87, type2: 724, type3: 21 },
  { date: '28/01/2020', type1: 175, type2: 318, type3: 10 },
  { date: '29/01/2020', type1: 328, type2: 1302, type3: 16 },
  { date: '30/01/2020', type1: 248, type2: 1830, type3: 33 },
  { date: '31/01/2020', type1: 334, type2: 1072, type3: 26 },
  { date: '01/02/2020', type1: 141, type2: 727, type3: 33 },
  { date: '02/02/2020', type1: 304, type2: 1706, type3: 21 },
  { date: '03/02/2020', type1: 135, type2: 1175, type3: 13 },
  { date: '04/02/2020', type1: 401, type2: 822, type3: 29 },
  { date: '05/02/2020', type1: 116, type2: 405, type3: 52 },
  { date: '06/02/2020', type1: 160, type2: 1784, type3: 12 },
  { date: '07/02/2020', type1: 396, type2: 609, type3: 22 },
  { date: '08/02/2020', type1: 397, type2: 820, type3: 33 },
  { date: '27/02/2020', type1: 421, type2: 308, type3: 10 },
  { date: '28/02/2020', type1: 94, type2: 1823, type3: 78 },
  { date: '29/02/2020', type1: 129, type2: 747, type3: 26 },
  { date: '01/03/2020', type1: 385, type2: 829, type3: 96 },
  { date: '02/03/2020', type1: 343, type2: 403, type3: 22 },
  { date: '03/03/2020', type1: 384, type2: 1578, type3: 19 },
  { date: '04/03/2020', type1: 75, type2: 168, type3: 15 },
  { date: '05/03/2020', type1: 162, type2: 297, type3: 35 },
  { date: '06/03/2020', type1: 281, type2: 595, type3: 10 },
  { date: '07/03/2020', type1: 249, type2: 1962, type3: 13 },
  { date: '08/03/2020', type1: 107, type2: 1358, type3: 92 },
  { date: '09/03/2020', type1: 151, type2: 1584, type3: 17 },
  { date: '10/03/2020', type1: 364, type2: 827, type3: 88 },
  { date: '11/03/2020', type1: 302, type2: 361, type3: 31 },
  { date: '12/03/2020', type1: 99, type2: 1970, type3: 26 },
  { date: '13/03/2020', type1: 322, type2: 1617, type3: 29 },
  { date: '14/03/2020', type1: 148, type2: 1607, type3: 13 },
  { date: '15/03/2020', type1: 199, type2: 1711, type3: 15 },
  { date: '16/03/2020', type1: 119, type2: 178, type3: 12 },
  { date: '17/03/2020', type1: 374, type2: 1502, type3: 20 },
  { date: '18/03/2020', type1: 335, type2: 697, type3: 20 },
  { date: '19/03/2020', type1: 398, type2: 1449, type3: 16 },
  { date: '20/03/2020', type1: 412, type2: 1996, type3: 48 },
  { date: '21/03/2020', type1: 146, type2: 1419, type3: 29 },
  { date: '22/03/2020', type1: 154, type2: 790, type3: 15 },
  { date: '23/03/2020', type1: 442, type2: 285, type3: 13 },
  { date: '24/03/2020', type1: 298, type2: 252, type3: 21 },
  { date: '25/03/2020', type1: 236, type2: 518, type3: 23 },
  { date: '26/03/2020', type1: 422, type2: 1832, type3: 28 },
  { date: '27/03/2020', type1: 101, type2: 360, type3: 17 },
  { date: '28/03/2020', type1: 447, type2: 1198, type3: 16 },
  { date: '29/03/2020', type1: 253, type2: 1358, type3: 13 },
  { date: '30/03/2020', type1: 53, type2: 909, type3: 48 },
  { date: '31/03/2020', type1: 354, type2: 1861, type3: 52 },
  { date: '01/04/2020', type1: 458, type2: 1540, type3: 19 },
  { date: '02/04/2020', type1: 178, type2: 677, type3: 13 },
  { date: '03/04/2020', type1: 425, type2: 1425, type3: 96 },
  { date: '04/04/2020', type1: 220, type2: 489, type3: 16 },
  { date: '05/04/2020', type1: 189, type2: 573, type3: 40 },
  { date: '06/04/2020', type1: 104, type2: 1470, type3: 41 },
  { date: '07/04/2020', type1: 261, type2: 803, type3: 26 },
  { date: '08/04/2020', type1: 325, type2: 709, type3: 17 },
  { date: '09/04/2020', type1: 361, type2: 362, type3: 20 },
  { date: '10/04/2020', type1: 141, type2: 363, type3: 87 },
  { date: '11/04/2020', type1: 179, type2: 977, type3: 10 },
  { date: '12/04/2020', type1: 239, type2: 531, type3: 63 },
  { date: '13/05/2020', type1: 378, type2: 1148, type3: 97 },
  { date: '14/05/2020', type1: 210, type2: 495, type3: 16 },
  { date: '15/05/2020', type1: 307, type2: 1633, type3: 10 },
  { date: '16/05/2020', type1: 332, type2: 1749, type3: 33 },
  { date: '17/05/2020', type1: 133, type2: 1915, type3: 63 },
  { date: '18/05/2020', type1: 185, type2: 752, type3: 30 },
  { date: '19/05/2020', type1: 440, type2: 1025, type3: 99 },
  { date: '20/05/2020', type1: 381, type2: 766, type3: 10 },
  { date: '21/05/2020', type1: 262, type2: 1289, type3: 23 },
  { date: '12/10/2020', type1: 57, type2: 1655, type3: 23 },
  { date: '13/10/2020', type1: 398, type2: 1250, type3: 27 },
  { date: '14/10/2020', type1: 397, type2: 622, type3: 17 },
  { date: '15/10/2020', type1: 276, type2: 1024, type3: 31 },
  { date: '16/10/2020', type1: 354, type2: 432, type3: 67 },
  { date: '17/10/2020', type1: 116, type2: 407, type3: 32 },
  { date: '18/10/2020', type1: 257, type2: 298, type3: 29 },
  { date: '19/10/2020', type1: 103, type2: 1097, type3: 19 },
  { date: '20/10/2020', type1: 406, type2: 869, type3: 14 },
  { date: '21/10/2020', type1: 387, type2: 1276, type3: 23 },
  { date: '22/10/2020', type1: 294, type2: 619, type3: 20 },
  { date: '23/10/2020', type1: 64, type2: 192, type3: 53 },
  { date: '24/10/2020', type1: 383, type2: 373, type3: 17 },
  { date: '25/10/2020', type1: 108, type2: 601, type3: 29 },
  { date: '26/10/2020', type1: 185, type2: 627, type3: 12 },
  { date: '27/10/2020', type1: 338, type2: 1786, type3: 18 },
  { date: '28/10/2020', type1: 191, type2: 482, type3: 11 },
  { date: '29/10/2020', type1: 310, type2: 551, type3: 54 },
  { date: '30/10/2020', type1: 232, type2: 864, type3: 97 },
  { date: '31/10/2020', type1: 102, type2: 1573, type3: 34 },
  { date: '01/11/2020', type1: 194, type2: 1295, type3: 40 },
  { date: '02/11/2020', type1: 164, type2: 1713, type3: 52 },
  { date: '03/11/2020', type1: 101, type2: 683, type3: 28 },
  { date: '04/11/2020', type1: 450, type2: 1697, type3: 28 },
  { date: '05/11/2020', type1: 70, type2: 885, type3: 23 },
  { date: '06/11/2020', type1: 146, type2: 1083, type3: 45 },
  { date: '07/11/2020', type1: 235, type2: 1376, type3: 23 },
  { date: '08/11/2020', type1: 199, type2: 875, type3: 15 },
  { date: '09/11/2020', type1: 305, type2: 698, type3: 12 },
  { date: '10/11/2020', type1: 452, type2: 732, type3: 31 },
  { date: '11/11/2020', type1: 219, type2: 1272, type3: 74 },
  { date: '12/11/2020', type1: 391, type2: 706, type3: 11 },
  { date: '13/11/2020', type1: 79, type2: 1589, type3: 13 },
  { date: '14/11/2020', type1: 124, type2: 1079, type3: 21 },
  { date: '15/11/2020', type1: 399, type2: 325, type3: 18 },
  { date: '16/11/2020', type1: 192, type2: 1813, type3: 25 },
  { date: '17/11/2020', type1: 338, type2: 1493, type3: 40 },
  { date: '18/11/2020', type1: 201, type2: 1277, type3: 19 },
  { date: '19/11/2020', type1: 348, type2: 186, type3: 51 },
  { date: '20/11/2020', type1: 300, type2: 1987, type3: 29 },
  { date: '21/11/2020', type1: 271, type2: 706, type3: 14 },
  { date: '22/11/2020', type1: 273, type2: 1620, type3: 11 },
  { date: '23/11/2020', type1: 234, type2: 654, type3: 38 },
  { date: '24/11/2020', type1: 347, type2: 1188, type3: 28 },
  { date: '25/11/2020', type1: 160, type2: 166, type3: 37 },
  { date: '26/11/2020', type1: 279, type2: 1429, type3: 14 },
  { date: '27/11/2020', type1: 49, type2: 1064, type3: 22 },
  { date: '28/11/2020', type1: 150, type2: 427, type3: 20 },
  { date: '29/11/2020', type1: 127, type2: 1300, type3: 31 },
  { date: '30/11/2020', type1: 371, type2: 1505, type3: 33 },
  { date: '01/12/2020', type1: 240, type2: 1843, type3: 22 },
  { date: '02/12/2020', type1: 441, type2: 1795, type3: 34 },
  { date: '03/12/2020', type1: 76, type2: 954, type3: 25 },
  { date: '04/12/2020', type1: 227, type2: 446, type3: 12 },
  { date: '05/12/2020', type1: 414, type2: 178, type3: 29 },
  { date: '06/12/2020', type1: 385, type2: 1624, type3: 15 },
  { date: '07/12/2020', type1: 122, type2: 758, type3: 20 },
  { date: '08/12/2020', type1: 231, type2: 836, type3: 12 },
  { date: '09/12/2020', type1: 413, type2: 1425, type3: 71 },
  { date: '18/01/2021', type1: 397, type2: 855, type3: 25 },
  { date: '19/01/2021', type1: 100, type2: 1318, type3: 89 },
  { date: '20/01/2021', type1: 276, type2: 1399, type3: 18 },
  { date: '21/01/2021', type1: 450, type2: 1084, type3: 15 },
  { date: '22/01/2021', type1: 374, type2: 271, type3: 44 },
  { date: '23/03/2021', type1: 455, type2: 1673, type3: 20 },
  { date: '24/03/2021', type1: 71, type2: 1017, type3: 20 },
  { date: '25/03/2021', type1: 48, type2: 1872, type3: 43 },
  { date: '26/03/2021', type1: 152, type2: 394, type3: 92 },
  { date: '27/03/2021', type1: 429, type2: 1111, type3: 27 },
  { date: '28/03/2021', type1: 64, type2: 1988, type3: 31 },
  { date: '29/03/2021', type1: 205, type2: 1106, type3: 12 },
  { date: '30/03/2021', type1: 179, type2: 1563, type3: 34 },
  { date: '31/03/2021', type1: 203, type2: 1621, type3: 19 },
  { date: '01/04/2021', type1: 47, type2: 1789, type3: 18 },
  { date: '02/04/2021', type1: 209, type2: 788, type3: 27 },
  { date: '03/04/2021', type1: 50, type2: 1564, type3: 29 },
  { date: '04/04/2021', type1: 158, type2: 423, type3: 15 },
  { date: '05/04/2021', type1: 291, type2: 1638, type3: 25 },
  { date: '06/04/2021', type1: 437, type2: 339, type3: 63 },
  { date: '07/04/2021', type1: 349, type2: 444, type3: 24 },
  { date: '08/04/2021', type1: 275, type2: 360, type3: 24 },
  { date: '09/04/2021', type1: 66, type2: 589, type3: 29 },
  { date: '10/04/2021', type1: 363, type2: 485, type3: 13 },
  { date: '11/04/2021', type1: 139, type2: 1455, type3: 10 },
  { date: '12/04/2021', type1: 358, type2: 1323, type3: 23 },
  { date: '13/04/2021', type1: 140, type2: 1557, type3: 10 },
  { date: '14/04/2021', type1: 228, type2: 198, type3: 10 },
  { date: '15/04/2021', type1: 214, type2: 1790, type3: 17 },
  { date: '16/04/2021', type1: 240, type2: 308, type3: 26 },
  { date: '17/04/2021', type1: 219, type2: 163, type3: 24 },
  { date: '14/05/2021', type1: 193, type2: 1088, type3: 23 },
  { date: '15/05/2021', type1: 172, type2: 1588, type3: 18 },
  { date: '16/05/2021', type1: 177, type2: 790, type3: 24 },
  { date: '17/05/2021', type1: 187, type2: 455, type3: 16 },
  { date: '18/05/2021', type1: 307, type2: 873, type3: 28 },
  { date: '11/06/2021', type1: 236, type2: 1632, type3: 20 },
  { date: '12/06/2021', type1: 406, type2: 1531, type3: 77 },
  { date: '13/06/2021', type1: 203, type2: 1095, type3: 23 },
  { date: '14/06/2021', type1: 63, type2: 285, type3: 25 },
  { date: '15/06/2021', type1: 381, type2: 1596, type3: 25 },
  { date: '16/06/2021', type1: 63, type2: 811, type3: 10 },
  { date: '17/06/2021', type1: 269, type2: 1653, type3: 66 },
  { date: '18/06/2021', type1: 290, type2: 1074, type3: 32 },
  { date: '19/06/2021', type1: 60, type2: 1186, type3: 14 },
  { date: '20/06/2021', type1: 245, type2: 445, type3: 30 },
  { date: '21/06/2021', type1: 200, type2: 210, type3: 21 },
  { date: '22/06/2021', type1: 245, type2: 1307, type3: 30 },
  { date: '23/06/2021', type1: 347, type2: 1662, type3: 29 },
  { date: '24/06/2021', type1: 298, type2: 1699, type3: 26 },
  { date: '25/06/2021', type1: 335, type2: 1686, type3: 21 },
  { date: '26/06/2021', type1: 47, type2: 1373, type3: 24 },
  { date: '27/06/2021', type1: 348, type2: 1016, type3: 30 },
  { date: '28/06/2021', type1: 415, type2: 1810, type3: 51 },
  { date: '29/06/2021', type1: 320, type2: 848, type3: 32 },
  { date: '30/06/2021', type1: 403, type2: 868, type3: 13 },
  { date: '01/07/2021', type1: 309, type2: 1958, type3: 21 },
  { date: '02/07/2021', type1: 257, type2: 1374, type3: 47 },
  { date: '03/07/2021', type1: 447, type2: 1118, type3: 20 },
  { date: '04/07/2021', type1: 56, type2: 428, type3: 12 },
  { date: '05/07/2021', type1: 348, type2: 377, type3: 28 },
  { date: '06/07/2021', type1: 182, type2: 1791, type3: 25 },
  { date: '07/07/2021', type1: 358, type2: 1713, type3: 25 },
  { date: '08/07/2021', type1: 126, type2: 1237, type3: 16 },
  { date: '09/07/2021', type1: 371, type2: 871, type3: 10 },
  { date: '10/07/2021', type1: 391, type2: 1670, type3: 12 },
  { date: '11/07/2021', type1: 59, type2: 1789, type3: 13 },
  { date: '12/07/2021', type1: 277, type2: 1939, type3: 33 },
  { date: '13/07/2021', type1: 316, type2: 1206, type3: 68 },
  { date: '14/07/2021', type1: 189, type2: 567, type3: 21 },
  { date: '15/07/2021', type1: 321, type2: 1318, type3: 29 },
  { date: '16/07/2021', type1: 159, type2: 1350, type3: 23 },
  { date: '17/07/2021', type1: 409, type2: 513, type3: 12 },
  { date: '18/07/2021', type1: 136, type2: 256, type3: 34 },
  { date: '19/07/2021', type1: 333, type2: 264, type3: 29 },
  { date: '20/07/2021', type1: 246, type2: 644, type3: 26 },
  { date: '21/07/2021', type1: 197, type2: 874, type3: 12 },
  { date: '22/07/2021', type1: 87, type2: 1479, type3: 26 },
  { date: '23/07/2021', type1: 458, type2: 223, type3: 36 },
  { date: '24/07/2021', type1: 90, type2: 861, type3: 21 },
  { date: '25/07/2021', type1: 348, type2: 1898, type3: 27 },
  { date: '26/07/2021', type1: 215, type2: 1541, type3: 97 },
  { date: '27/07/2021', type1: 260, type2: 188, type3: 33 },
  { date: '28/07/2021', type1: 58, type2: 318, type3: 21 },
  { date: '29/07/2021', type1: 101, type2: 336, type3: 27 },
  { date: '30/07/2021', type1: 431, type2: 1928, type3: 33 },
  { date: '31/07/2021', type1: 242, type2: 585, type3: 49 }
];

const groupTimelineData = (elements, type) => {

console.log('start')
  const result = elements.reduce((previous, current, currentIndex, array) => {
    const curSomething = moment(current.date, 'DD/MM/YYYY')[type]() + (type === 'month' ? 1 : 0); // this is the number of month or the week
    let rightPlace = previous.find(e => e[type] === curSomething);

    if (!rightPlace) { rightPlace = { [type]: curSomething, type1: 0, type2: 0, type3: 0 }; previous.push(rightPlace); }

    rightPlace.type1 += current.type1;
    rightPlace.type2 += current.type2;
    rightPlace.type3 += current.type3;

    return previous;
  }, []);

  return result;
};

console.log(groupTimelineData(data, 'month'));
console.log(groupTimelineData(data, 'isoWeek'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>

数据集减少


推荐阅读