【问题标题】:date sort returning last item in list instead of latest date日期排序返回列表中的最后一项而不是最新日期
【发布时间】:2020-11-23 03:04:40
【问题描述】:

问题:日期排序未返回最大值。

所需输出:返回数组中的最大/最新日期。

我在谷歌应用程序脚本中有以下功能。 我正在传递日期并试图获得最大的日期。 它排序但返回列表中的最后一项而不是最新日期。有什么帮助吗?

(dcmDates 从工作表中提取并格式化为日期。)

  lastDate = dcmDates.sort(function(a, b) {

                        if(isNaN(a)) { return -1; }
                        if(new Date(a) > new Date(b)) { return 1; }
                        if(new Date(a) <= new Date(b)) { return -1; }
                        //return 0;
                      
                        })[0];

【问题讨论】:

    标签: arrays date google-apps-script


    【解决方案1】:

    我能够重现您的问题,但它没有使用您的条件正确排序数组。我尝试稍微修改您的函数并对其进行简化,以便您在需要时更轻松地调整脚本:

      lastDate = dcmDates.sort(function(a, b) {
        return new Date(b) - new Date(a);
      })[0]; 
    

    要轻松访问最大日期,您需要做的是反转要减去的日期。这样,最大日期将始终放在第一个索引处。

    对于可能的 NaN 单元格,我这里没有包含,但是你可以在返回之前添加 NaN 检查。上面的代码假定单元格中只有日期值。

    编辑:

    如果您想从比较/排序中排除非日期数据,您需要在排序之前先过滤您的 dcmDates。

    var dcmDates = values.filter(date => !(isNaN(new Date(date).getTime())));
    

    这是不言自明的,但您只想在排序前包含有效日期。这并不完全符合您的要求,例如将 NaN 值放在排序的底部,但输出将是相同的,得到有效的最新日期。

    【讨论】:

    • 谢谢。 NaN / 非日期检查非常关键。你能就此提出建议吗?我无法理解如何将它们排序到底部。另外,如果 a 和 b 是日期,为什么我必须再次使它们成为日期。如果 a 或 b 不是日期,这不会引发错误吗?
    • 它似乎忽略了 text/notnumber 项就可以了。谢谢。我想我只是把它复杂化了......
    • 嗨@JasonTorpy,你能试着给我一些可能不被视为该列日期的具体值吗?我会尝试在我这边复制那些,并会用更新的答案回复你。如果可能的话,所有可能的非日期值的一种类型,这样我们就不会遇到意外的结果。
    • 这些包括空格、特殊字符、非标准格式日期、具有不同格式的日期等。它可能不像其他示例那么重要,但如果我们也采取措施防止不必要的失败。
    • 实际上如果发现从排序数组中删除非日期更容易。我理解你所说的“不是约会”可能是什么意思。先排除然后排序似乎更有意义。你所拥有的现在对我有用。谢谢!
    【解决方案2】:

    您正在按升序对日期进行排序,并从结果中获取第 0 项。另外,在排序之前检查日期的格式是否正确。 Console.log 并验证输出。

    【讨论】:

    • 感谢您的浏览。我确实检查了格式。那里应该有两个功能,第一个将 NaN 优先级降到最低。不确定这是否也能捕捉到日期。我的意图是对日期进行降序排序(然后是底部的 text/NaN)。并抓住第一个项目。你能推荐一个调整来解决这个问题吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2016-08-10
    • 2018-03-31
    相关资源
    最近更新 更多