【问题标题】:TypeScript Sorting Object by DateTypeScript 按日期排序对象
【发布时间】:2019-07-05 04:20:34
【问题描述】:

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

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

TS 错误:

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

/transactions-view.component.ts(72,35): 错误 TS2363: 右手 算术运算的一侧必须是“任何”、“数字”或 枚举类型。

【问题讨论】:

  • 错误信息中有什么不清楚的地方?您正在减去 dates,这将导致 TypeScript 避免的隐式类型强制。

标签: typescript


【解决方案1】:

与其依赖于将 Date 对象强制转换为它们的基础毫秒数自时代值,不如直接获取自时代以来毫秒值并在 - 表达式中使用它。

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

假设a.dateb.date字符串

如果a.dateb.date是字符串,可以使用Date.parse解析字符串,规则与new Date一样,直接得到毫秒数:

return Date.parse(b.date) - Date.parse(a.date);

请注意,您问题中的代码和原始代码都假定 a.dateb.date 确实在 appropriate format 中,将由 Date 对象解析。

假设a.dateb.date 是数字

如果a.dateb.date已经毫秒-since-The-Epoch 值,直接使用它们:

return b.date - a.date;

假设a.dateb.dateDate 实例

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

return b.date.getTime() - a.date.getTime();

【讨论】:

  • 感谢您的帮助,a.date 和 b.date 是日期对象,但使用 b/a.date.getTime() 给了我一个错误:a.date.getTime() is not a function。但是使用new Date(a.date).getTime() 就可以了。想知道日期对象是否不是真正的日期对象,因为我从本地存储中读回了它们?不确定。
  • @Aragorn - 如果您收到该错误,它们不是 Date 对象。 “想知道日期对象是否不是真正的日期对象,因为我从本地存储中读取它们?” 是的。 Web 存储仅存储 字符串
  • 嘿,我在我的身上试过这个,但没用..ERROR TypeError: Cannot read properties of null (reading 'getTime'
  • 我正在尝试按日期字段对我的对象进行排序,并尝试了您的#3 解决方案。它们是我后端和前端中的 Date 对象
  • Nvm,我做了new Date(a.date).getTime(),它成功了!
【解决方案2】:

原因

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

sort(compareFn?: (a: T, b: T) => number): this;

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

解决方案 1

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

将您的 Date 对象明确地转换为数字:

this.filteredTxs.sort(function(a,b): any{
        return (b.date.getTime() - a.date.getTime());
});

解决方案 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
});

【讨论】:

  • 解决方案 1 与 OP 的代码一样不正确,通过假设 a.dateb.dateDate 对象然后创建新的 Date 并不清楚您想要实现的目标对象……?另外,"...这意味着compareFn 应该返回一个number。" OP 的代码确实返回一个数字。问题在于 - 运算符,而不是 sort 方法回调。
  • 解决方案 1 对我有用。 date 属性 date 对象。但是,为什么我必须创建一个new Date() 才能访问它们上的getTime() 函数?是因为原型吗?
  • 完全没有,这只是我在 DevTools 中试验的剩余部分。我清理了我的答案。对于造成混乱,我深表歉意。
猜你喜欢
  • 2017-08-01
  • 2018-09-25
  • 2017-08-19
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 2013-10-18
  • 2014-05-12
相关资源
最近更新 更多