gpt4 book ai didi

javascript - 如何使用 moment 和 lodash 按对象字段分组并按日期计数?

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:54:30 28 4
gpt4 key购买 nike

我的情况相当复杂,我不确定如何使用 lodash 和 moment 进行转换。假设我有一个日期范围和这个初始数据。

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 对所有“组”字段进行分组,并在名为“日期”的新对象中使用一个新字段,这将是日期的键/值对。键是日期范围(从开始日期到结束日期),值是匹配日期的计数。

新的输出看起来像这样:

 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 并导入了这种情况的 moment 和 lodash。

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

如能提供帮助,万分感谢!

最佳答案

你可以用纯javascript解决这个问题。

首先您在开始日期和结束日期之间创建一个日期 数组。如果 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"].

其次你可以使用.reduce()在您的 data 上聚合所需的值并结合 .forEach()dates 数组上,以便在您没有特定日期的数据时填补日期空白。

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"
}
}

将上面的代码复制到您的 Web 控制台并查看 console.table(output) 的结果。

我还修改了你的 jsfiddle demo

关于javascript - 如何使用 moment 和 lodash 按对象字段分组并按日期计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48932533/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com