You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript中对象字面量排序与Switch/Case逻辑结果不一致问题

问题分析与解决

核心问题

你用对象字面量实现的排序逻辑存在致命错误:对象初始化时,所有属性的赋值表达式会被立即全部执行。

在你的sortExpensesWithObjectLiterals方法中,创建literals对象时,id、employeeid、dateincurred对应的this.dataSource.data = this.dataSource.data.sort(...)语句会依次全部执行,而不是只执行sort.active对应的那一项。这导致数据源被连续三次排序,最终结果是最后一次排序(dateincurred字段的排序)的结果,自然和switch版本仅执行单一字段排序的结果不符。
最后一行的literals[sort.active as keyof typeof literals];只是访问了对象的某个属性值,但此时所有排序已经完成,这行代码没有任何实际作用。

修正方案

应该把对象的属性值定义为排序比较函数,而不是直接执行排序的语句。然后根据sort.active取出对应的比较函数,再执行排序操作:

sortExpensesWithObjectLiterals(sort: Sort): void {
    // 定义各字段对应的排序比较函数
    const sortComparators = {
      id: (a: Expense, b: Expense) => 
        sort.direction === 'asc' ? a.id - b.id : b.id - a.id,
      employeeid: (a: Expense, b: Expense) => 
        sort.direction === 'asc' ? a.employeeid - b.employeeid : b.employeeid - a.employeeid,
      dateincurred: (a: Expense, b: Expense) => 
        sort.direction === 'asc' 
          ? a.dateincurred < b.dateincurred ? -1 : 1 
          : b.dateincurred < a.dateincurred ? -1 : 1
    };

    // 获取当前激活字段对应的排序函数
    const comparator = sortComparators[sort.active as keyof typeof sortComparators];
    if (comparator) {
      // 创建数组副本后再排序(避免原地修改原数组的副作用)
      this.dataSource.data = [...this.dataSource.data].sort(comparator);
    }
  }

额外优化说明

  • 使用[...this.dataSource.data]创建原数组的浅拷贝再执行排序,因为数组的sort方法是原地排序,会直接修改原数组。这种写法可以避免意外影响到其他引用该数组的代码逻辑,同时也符合不可变数据的编程习惯。
  • 增加了if (comparator)的判断,避免当sort.active不在预期字段范围内时出现错误。

内容的提问来源于stack exchange,提问作者user3253156

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 08:33:25