【问题标题】:TypeScript sort by date not workingTypeScript 按日期排序不起作用
【发布时间】:2017-03-08 00:21:27
【问题描述】:

我有一个对象TaskItemVO,字段为dueDate,其类型为Date

export class TaskItemVO {
    
    public dueDate: Date;
}

我有这个方法,当我尝试按日期排序但它不起作用时调用它:

public sortByDueDate(): void {
    this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
        return a.dueDate - b.dueDate;

    });
}

我在方法的返回行中收到此错误:

算术运算的右侧必须是“任意”、“数字”或枚举类型。

算术运算的左侧必须是“any”、“number”或枚举类型。

那么在 TypeScript 中按日期字段排序数组的正确方法是什么?

【问题讨论】:

  • 如错误信息所示,您需要将日期转换为数字。
  • 如果可以是undefined,该类可能应该在其签名中注明public dueDate?: Date;

标签: sorting typescript


【解决方案1】:

我认为最好使用valueOf

public sortByDueDate(): void {
    this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
        return a.dueDate.valueOf() - b.dueDate.valueOf();
    });
}

根据文档:/** 返回自 UTC 1970 年 1 月 1 日午夜以来存储的时间值(以毫秒为单位)。 */

【讨论】:

    【解决方案2】:

    如果您遇到上述已接受答案的问题。我通过创建一个新的 Date 并传入 date 参数来让它工作。

      private getTime(date?: Date) {
        return date != null ? new Date(date).getTime() : 0;
      }
    
      public sortByStartDate(array: myobj[]): myobj[] {
        return array.sort((a: myobj, b: myobj) => {
          return this.getTime(a.startDate) - this.getTime(b.startDate);
        });
      }
    

    【讨论】:

      【解决方案3】:

      作为可能的解决方法,您可以在此处使用一元 + 运算符:

      public sortByDueDate(): void {
          this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
              return +new Date(a.dueDate) - +new Date(b.dueDate);
          });
      }
      

      【讨论】:

      【解决方案4】:

      尝试使用Date.getTime() 方法:

      public sortByDueDate(): void {
          this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
              return a.dueDate.getTime() - b.dueDate.getTime();
      
          });
      }
      

      ^ 上面会抛出未定义日期的错误,因此请尝试以下操作:


      编辑

      如果要处理未定义:

      private getTime(date?: Date) {
          return date != null ? date.getTime() : 0;
      }
      
      
      public sortByDueDate(): void {
          this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
              return this.getTime(a.dueDate) - this.getTime(b.dueDate);
          });
      }
      

      【讨论】:

      • 当日期未定义时这会引发错误,所以我正在做一个可怕的黑客攻击,请检查更新,有什么合适的方法吗?
      • 无论如何我都赞成,但如果有人给出正确的答案,请留下接受的答案,感谢您的时间和回答
      • 检查我修改后的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多