TypeScript 按日期排序对象

Ara*_*orn 1 typescript

我有这个小代码是从另一个问题借来的,用于按日期对数组中的对象进行排序。但是,我不知道如何将其移植到 TypeScript。

this.filteredTxs.sort(function(a,b): any{
        return new Date(b.date) - new Date(a.date);
});
Run Code Online (Sandbox Code Playgroud)

TS错误:

/transactions-view.component.ts(72,16) 中的错误:错误 TS2362:算术运算的左侧必须是“any”、“number”或枚举类型。

/transactions-view.component.ts(72,35): error TS2363: 算术运算的右侧必须是“any”、“number”或枚举类型。

T.J*_*der 9

与其依赖于将Date对象强制转换为它们的底层毫秒数 -since-the-Epoch 数值,不如直接获取毫秒数,并在-表达式中使用它。

您还没有告诉我们是什么a.dateb.date是什么,但我们可以推断它们是字符串、数字或(暂时)Date实例。

假设a.dateb.date字符串

如果a.dateb.date是字符串,您可以使用Date.parse相同的规则解析字符串new Date并直接获取毫秒以来的时间值:

return Date.parse(b.date) - Date.parse(a.date);
Run Code Online (Sandbox Code Playgroud)

请注意,您的问题中的原始代码和原始代码都假设a.date并且b.date确实采用了适合Date对象解析的格式

假设a.dateb.date是数字

如果a.dateb.date已经毫秒,因为最大纪元值,直接使用它们:

return b.date - a.date;
Run Code Online (Sandbox Code Playgroud)

假设a.dateb.dateDate实例

如果a.dateb.dateDate实例,则用于getTime获取它们的基础毫秒数-since-The-Epoch 值:

return b.date.getTime() - a.date.getTime();
Run Code Online (Sandbox Code Playgroud)


Kar*_*ski 5

原因

的类型签名Array.prototype.sort是:

sort(compareFn?: (a: T, b: T) => number): this;
Run Code Online (Sandbox Code Playgroud)

这意味着compareFn应该返回 a number。在您的情况下,您试图从另一个没有多大意义的对象中减去一个对象。它之所以有效,只是因为 JavaScript 为您隐式地强制了它们的类型。

解决方案1

从你的问题来看,我假设filteredTxs是包含datetype 属性的对象Date

将您的Date对象显式转换为一个数字:

this.filteredTxs.sort(function(a,b): any{
        return (b.date.getTime() - a.date.getTime());
});
Run Code Online (Sandbox Code Playgroud)

解决方案2

使用隐式转换来比较日期,但仅用于比较目的,而不是用于减法。

this.filteredTxs.sort(function(a,b): any {
  .sort((a, b) => {
    if (left.date === right.date) {
      return 0;
    }

    return (left.date > right.date)
      ? 1
      : -1
});
Run Code Online (Sandbox Code Playgroud)