javascript - 从“当前时间”开始计算具有最近几天、几周和几个月的时间戳的对象(在数组中)
问题描述
我有一个带有时间戳作为属性的对象数组:
样本输入:
const data = [
{
_id: "602102db3acc4515d4b2f687",
createdDt: "2021-02-08T09:22:35.000Z",
},
{
_id: "6021024da706a260d8932da2",
createdDt: "2021-02-08T09:20:13.000Z",
},
// ...
// ...
{
_id: "6020fd863acc4515d4b2f685",
createdDt: "2021-02-08T08:59:50.000Z",
},
];
现在从当前日期开始,我需要具有今天、前一天等时间戳的对象总数(如果前一天没有条目,则计数可以为零)。
同样,我需要今天、前一天等的计数,周和月也一样。
例如,我期望的输出可能是:
样本输出:
const result = {
days: [0, 0, 5, 10, ...],
weeks: [15, 5, 8, 0, ...],
months: [30, 42, 33, 23, ...]
}
我正在使用 ES6、Lodash 和 moment.js。这是用于基本图形表示。
更新:
这是我写的代码,有人可以提出一个更简单的解决方案吗?
我目前的解决方案:
for (var i = 0, k = 1; i < 365; i++, k++) {
let dt = moment().subtract(i, "days");
let td = moment().subtract(k, "days");
builddays.push(0);
for (var j = 0; j < drivers.length; j++) {
let ddt = new Date(drivers[j].createdDt);
if (moment(ddt).isBetween(td, dt)) builddays[i] = drivers[j].count;
}
}
var weeksbifurcate = builddays.reduce((resultArray, item, index) => {
const chunkIndex = Math.floor(index / 7);
if (!resultArray[chunkIndex]) {
resultArray[chunkIndex] = [];
}
resultArray[chunkIndex].push(item);
return resultArray;
}, []);
var monthsbifurcate = builddays.reduce((resultArray, item, index) => {
const chunkIndex = Math.floor(index / 30);
if (!resultArray[chunkIndex]) {
resultArray[chunkIndex] = [];
}
resultArray[chunkIndex].push(item);
return resultArray;
}, []);
for (i = 0; i < 12; i++) {
days.push(builddays[i]);
weeks.push(weeksbifurcate[i].reduce(getSum, 0));
months.push(monthsbifurcate[i].reduce(getSum, 0));
}
解决方案
使用moment # diff来查找索引,即dayIndex
, weekIndex
,并在对应的 in对象中monthIndex
放置或增加右边:index
array
result
const solve = (data) => {
const result = {
days: [],
weeks: [],
months: [],
};
data.forEach((item) => {
const today = moment();
const createdDt = moment(item.createdDt);
const dayIndex = today.diff(createdDt, "days");
const weekIndex = today.diff(createdDt, "weeks");
const monthIndex = today.diff(createdDt, "months");
result.days[dayIndex] = (result.days[dayIndex] || 0) + 1;
result.weeks[weekIndex] = (result.weeks[weekIndex] || 0) + 1;
result.months[monthIndex] = (result.months[monthIndex] || 0) + 1;
});
return result;
};
const data = [
{createdDt: "2021-03-03T00:00:00.000Z",},
{createdDt: "2021-03-03T00:00:00.000Z",},
{createdDt: "2021-03-01T00:00:00.000Z",},
{createdDt: "2021-02-28T00:00:00.000Z",},
{createdDt: "2021-02-27T00:00:00.000Z",},
{createdDt: "2021-02-27T00:00:00.000Z",},
{createdDt: "2021-02-27T00:00:00.000Z",},
{createdDt: "2021-02-24T00:00:00.000Z",},
{createdDt: "2021-02-23T00:00:00.000Z",},
];
console.log(solve(data));
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>
结果中的值可能很少undefined
,但无需将其设置为,0
因为它可以被视为0
您要显示/使用它的任何位置。
推荐阅读
- angular - 带有搜索信息的搜索框(如 Stackoverflow 搜索)
- node.js - 如何在使用 fetch 的 post/get 请求中使用 await?
- spring-boot - 通过 Prometheus 指标对 @Timed 注释进行 Splunk 查询
- android - 如何使用 Spotify API 将音乐流式传输到我们的 Android 应用程序?
- performance - BST算法中给定范围内节点计数的运行时间
- c++ - 为什么相同的语句不适用于 C++ 中的类成员?
- swift - XMLMapper 未在 UITableView 中显示结果
- docker - 如何配置我的 docker-compose 以将在 docker 容器中运行的“应用程序”连接到在物理机中运行的“数据库”
- python - 从python中的列表中删除多余的括号
- flutter - 如何将折叠动画添加到小部件?