首页 > 解决方案 > 如何比较两个日期是否更接近

问题描述

我想检查两个日期是否在彼此的范围内,并重新排序我的数组。我需要将数组中的日期与当前日期进行比较。

我有这个:

var currentDate = new Date(); /* current date = 2021/08/18 */
listOfObjects = [ { "user": "John", "date": "2021-08-20" }, { "user": "Bob", "date": "2021-08-17" }, { "user": "Joe", "date": "2021-08-09" } ]

返回应该是这样的:

[ { "user": "Bob", "date": "2021-08-17" }, { "user": "John", "date": "2021-08-20" }, { "user": "Joe", "date": "2021-08-09" } ]

标签: javascriptarraysdatesorting

解决方案


在 JavaScript 中,数组是通过对其项的文本表示进行排序来进行排序的。

默认排序顺序是升序,将元素转换为字符串,然后比较它们的 UTF-16 代码单元值序列。
(来源:Array.prototype.sort() - JavaScript | MDN

请参见以下示例:

const numbers = [1, 30, 4, 21, 100000];
numbers.sort();
console.log(numbers);

我们看到输出是具有按字母顺序排列的数字的数组:

1, 100000, 21, 30, 4

在大多数情况下,这不是我们想要的(或大多数人所期望的)。为了对数字进行数字排序,我们传递了一个自定义比较函数来排序:

function i_cmp(a, b) {
    let d = a-b;
    if (d < 0)
        return -1;
    if (d > 0)
        return 1;
    return 0;
}

numbers.sort(i_cmp);
console.log(numbers);

输出:

1,4,21,30,100000

要按取决于进一步条件的标准对数组进行排序,传递绑定到由另一个函数创建的运行时值的函数会很方便。在这里,我们按项目的绝对距离对固定值进行排序x

function d_cmp(x) {
    return function(a, b) {
        let d = Math.abs(a-x)-Math.abs(b-x);
        if (d < 0)
            return -1;
        if (d > 0)
            return 1;
        return 0;
    }
}

numbers.sort(d_cmp(50));
console.log(numbers);

输出:

30,21,4,1,100000

Hemera 已经回答了如何获取日期距离。其余的,访问date属性,应该很容易实现。


有关上述代码(组合)的现场演示,请参见:https ://ideone.com/e7DaOx


推荐阅读