如何使用时刻和lodash按对象字段分组并按日期计算?

时间:2018-02-22 16:30:54

标签: javascript json momentjs lodash

我有一个非常复杂的情况,我不知道如何使用lodash和时刻进行转换。假设我有一个日期范围和这个初始数据。

var startDate = "2018-02-21"
var endDate = "2018-02-23"
var data = [
      {
       "date": "2018-02-21 21:21:17",
       "group": "A"
       },
      {
       "date": "2018-02-21 21:21:17",
       "group": "B"
       },
      {
       "date": "2018-02-23 21:21:17",
       "group": "A"
       },
      {
       "date": "2018-02-21 21:21:17",
       "group": "B"
       }
  ];

我想使用lodash对所有“group”字段进行分组,并在名为“dates”的新对象中添加一个新字段,该字段将是一对键/值日期对。键将是日期范围(从startDate到endDate),值将是匹配日期的计数。

新输出如下所示:

 var output = [
    {
        "group": "A",
        "dates": [
            "2018-02-21": 1,
            "2018-02-22": 0
            "2018-02-23": 1
        ]
    },
    {
        "group": "B",
        "dates": [
            "2018-02-21": 2,
            "2018-02-22": 0,
            "2018-02-23": 0
        ]
    }
  ];

我创建了一个jsfiddle并导入了这种情况的时刻和lodash。

http://jsfiddle.net/dp7rzmw5/6467/

如果你能提供帮助,非常感谢你!

1 个答案:

答案 0 :(得分:3)

您可以使用纯JavaScript来解决此问题。

首先您在开始日期和结束日期之间创建了一个dates数组。如果data中缺少天数,我们稍后会使用此数组。

var dates = [];
var startDate = new Date("2018-02-21");
var endDate = new Date("2018-02-23");
for (var s = startDate; s <= endDate; s.setDate(s.getDate() + 1)) {
    dates.push(s.toISOString().split('T')[0]);
}

现在dates是一个数组:[ "2018-02-21", "2018-02-22", "2018-02-23" ]

第二次您可以使用data上的.reduce()汇总dates数组中.forEach()的所需值以填充如果您没有特定日期的数据,那么这一天会有差距。

var groups = [];
var output = data.reduce((obj, item) => {
    var d = new Date(item.date).toISOString().split('T')[0];
    var x = groups.indexOf(item.group);
    if (x === -1) {
        groups.push(item.group);
        x = groups.indexOf(item.group);
    }
    obj[x] = obj[x] || {};
    obj[x]["date"] = obj[x]["date"] || {};
    dates.forEach(date => {
        if (!obj[x]["date"][date]) {
            obj[x]["date"][date] = 0;
        }
    });
    obj[x]["date"][d]++;
    obj[x]["group"] = item.group;
    return obj;
}, {});

输出 是:

{
  "0": {
    "date": {
      "2018-02-21": 1,
      "2018-02-22": 0,
      "2018-02-23": 1
    },
    "group": "A"
  },
  "1": {
    "date": {
      "2018-02-21": 2,
      "2018-02-22": 0,
      "2018-02-23": 0
    },
    "group": "B"
  }
}

将以上代码复制到您的网络传真机中,然后查看console.table(output)

的结果

我还修改了 jsfiddle demo