首页 > 解决方案 > 我需要映射这个数组并输出过去 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"
}]

标签: javascriptarrays

解决方案


为了检索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最近和最近条目之间的值差异:

  1. getLevelDiff函数中,我将每行数据的日期与当前日期进行比较,并将天数的差异临时存储在我调用的属性中diff
  2. 然后,我过滤日期为 7 天或更早的行。
  3. 接下来,我按行的天数对行进行排序。
  4. 最后,我从最近日期的级别中减去按日期过滤的最旧行的级别,并在函数的下一行返回该值。

这是在行动:

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 天及其值,请将 切换为78包含 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)

推荐阅读