我有一个非常复杂的情况,我不知道如何使用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/
如果你能提供帮助,非常感谢你!
答案 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 。