我有这个小代码是从另一个问题借来的,用于按日期对数组中的对象进行排序。但是,我不知道如何将其移植到 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”或枚举类型。
与其依赖于将Date
对象强制转换为它们的底层毫秒数 -since-the-Epoch 数值,不如直接获取毫秒数,并在-
表达式中使用它。
您还没有告诉我们是什么a.date
和b.date
是什么,但我们可以推断它们是字符串、数字或(暂时)Date
实例。
a.date
和b.date
是字符串如果a.date
和b.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.date
和b.date
是数字如果a.date
和b.date
是已经毫秒,因为最大纪元值,直接使用它们:
return b.date - a.date;
Run Code Online (Sandbox Code Playgroud)
a.date
和b.date
是Date
实例如果a.date
和b.date
是Date
实例,则用于getTime
获取它们的基础毫秒数-since-The-Epoch 值:
return b.date.getTime() - a.date.getTime();
Run Code Online (Sandbox Code Playgroud)
原因
的类型签名Array.prototype.sort
是:
sort(compareFn?: (a: T, b: T) => number): this;
Run Code Online (Sandbox Code Playgroud)
这意味着compareFn
应该返回 a number
。在您的情况下,您试图从另一个没有多大意义的对象中减去一个对象。它之所以有效,只是因为 JavaScript 为您隐式地强制了它们的类型。
解决方案1
从你的问题来看,我假设
filteredTxs
是包含date
type 属性的对象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)
归档时间: |
|
查看次数: |
6480 次 |
最近记录: |