javascript - 我需要映射这个数组并输出过去 7 天与当前日期的“级别”差异
问题描述
让我尝试使输出更清晰。该数组包含一个角色获得/失去的等级,以及获得或失去等级的实际日期。我想输出过去 7 天内获得/损失的水平(与当前日期相比)。
数组示例:
"array": [{
"date": "2019-12-19 15:53:21",
"level": "365"
}, {
"date": "2019-12-20 04:18:24",
"level": "366"
}, {
"date": "2019-12-30 06:57:15",
"level": "370"
}, {
"date": "2019-12-30 22:19:30",
"level": "371"
}, {
"date": "2020-01-02 05:45:14",
"level": "369"
}, {
"date": "2020-01-02 09:55:15",
"level": "370"
}, {
"date": "2020-01-02 18:42:11",
"level": "367"
}, {
"date": "2020-01-03 05:15:08",
"level": "368"
}]
解决方案
为了检索level
过去 7 天内数据中最近和最近的数据行的值差异,使用提供的此数据...</p>
{
array: [
{ date:"2021-08-17 03:02:02", level: "407" },
{ date:"2021-08-23 05:34:03", level: "408" },
{ date:"2021-08-26 03:46:03", level: "409" },
{ date:"2021-08-27 23:08:14", level: "410" },
{ date:"2021-08-30 23:05:03", level: "411" }
]
}
…您可以采取这些步骤将数组过滤为仅过去 7 天内的数组,然后评估level
最近和最近条目之间的值差异:
- 在
getLevelDiff
函数中,我将每行数据的日期与当前日期进行比较,并将天数的差异临时存储在我调用的属性中diff
。 - 然后,我过滤日期为 7 天或更早的行。
- 接下来,我按行的天数对行进行排序。
- 最后,我从最近日期的级别中减去按日期过滤的最旧行的级别,并在函数的下一行返回该值。
这是在行动:
const data = {
array: [
{ date:"2021-08-17 03:02:02", level: "407" },
{ date:"2021-08-23 05:34:03", level: "408" },
{ date:"2021-08-26 03:46:03", level: "409" },
{ date:"2021-08-27 23:08:14", level: "410" },
{ date:"2021-08-30 23:05:03", level: "411" }
]
};
const today = new Date();
const getLevelDiff = arr => {
const compared = arr.map(row => ({...row, diff: (today - new Date(row.date)) / 8.64e+7})),
filtered = compared.filter(row => row.diff < 7),
sorted = filtered.sort((a, b) => a.diff - b.diff),
diff = sorted.length ? +sorted[0].level - +sorted[sorted.length - 1].level : null;
return diff;
}
console.log('The level difference is ' + getLevelDiff(data.array));
值得一提的几点——</p>
- 在我的日期比较中,我检查过去 7 天内发生的任何日期,范围在当前日期(
0
几天前)和7
几天前之间。一旦某个日期至少过去 7 天,它就会超过一周,因此会被过滤掉。如果您想包含前 7 天及其值,请将 切换为7
以8
包含 7 天前的条目。 - 还值得一提的是,这些是日期时间比较,因此当前时间之前 7 天前的一行数据将被视为超过 7 天,因此被过滤掉,而在当前时间之后7 天前的一行数据当前时间将被视为不到 7 天,因此将被保留。如果您只想按日期进行比较,与时间无关,我可以通过在比较时忽略
date
属性的时间分量来调整我的函数以仅按日期进行比较,并且只比较今天的日期而不是当前的日期时间。如果您希望我进行此调整,请告诉我。 - 我选择使用一元运算
+
符将level
字符串转换为数字,但您可以使用Number()
,或者parseInt()
如果您愿意。 - 在这一行中,我还进行了三元检查,以确保至少有一行数据,以防止发生任何错误。如果没有与过滤器匹配的数据行,则函数返回
null
。 - 考虑到前一点,如果只有一行,函数将返回
0
,因为过滤后的数组中的第一个和最后一个元素相同,因此具有相同的level
值。如果您想返回null
要比较的数组元素少于 2 个,只需将我的sorted.length
检查切换为sorted.length > 1
(大于 1,至少 2)。 - 根据级别的工作方式,如果最近日期的
level
值小于最近日期的值,则该函数将返回负值(例如-1
)。如果您总是希望将level
值差返回为正数,只需将返回值包装起来以返回结果值Math.abs()
的绝对(正)值,如下所示Math.abs(diff)
:
推荐阅读
- javascript - 新手>如何搜索和排列提示词<
- sql-server - 批量复制数据而不进行排序
- css - Firefox CSS样式表未加载
- c# - 使用 Autofac 将 IServiceProvider 注入工厂类
- c++ - System.Runtime.InteropServices.SEHException 与最新的 Crystal Report Runtime SP27
- java - 更快地遍历地图并匹配键中的模式
- delphi - 如何在 DrawAllPoints:= false 时绘制每个像素、巨大 TeeChart FastLine 系列的最小值和最大值?
- c# - C#如何获取两个字符之间的字符串?升C
- sql - 如何在 CASE 语句中创建多个可能重叠的条件并使用 GROUP BY
- android - 是否可以加载非 AutoML 训练的 tflite 模型以在 Android 上与 FirebaseAutoMLLocalModel 一起使用?