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
相关产品推荐
相关产品推荐

