如何更简洁编写支持ASCENDING/DECENDING的数组排序函数?
简化排序函数的方案
我懂这种重复代码让人挠头的感觉!其实咱们可以把重复的逻辑抽出来,通过排序类型控制结果的正负,就能轻松消除冗余啦。先看看优化后的写法:
基础优化版(保留你的比较逻辑)
const sortStudiesByName = (studies, type) => { // 先复制原数组,避免原地修改原数据(sort是原地排序哦) const sortedStudies = [...studies].sort((a, b) => { const nameA = a.name.toUpperCase(); const nameB = b.name.toUpperCase(); // 先算出升序的比较结果 let comparison = 0; if (nameA > nameB) { comparison = 1; } else if (nameA < nameB) { comparison = -1; } // 根据排序类型决定是否反转结果 return type === 'ASCENDING' ? comparison : -comparison; }); return sortedStudies; };
更简洁的localeCompare版
如果是字符串排序,用localeCompare会更省心,它直接返回符合要求的-1/0/1,代码能再瘦一圈:
const sortStudiesByName = (studies, type) => { return [...studies].sort((a, b) => { const nameA = a.name.toUpperCase(); const nameB = b.name.toUpperCase(); // 先得到升序结果,再根据类型反转 const ascendingResult = nameA.localeCompare(nameB); return type === 'ASCENDING' ? ascendingResult : -ascendingResult; }); };
关键思路说明
- 避免原地修改:
Array.sort()会直接修改原数组,所以用[...studies]创建副本,防止意外污染原数据。 - 消除重复:把转大写、基础比较逻辑只写一次,通过
type判断是否反转结果——升序用原结果,降序取反,完美复用逻辑。 - 小提示:如果是项目里约定的排序类型拼写是
DECENDING(标准拼写是DESCENDING),代码也能正常工作,只要保持判断条件和传入的类型一致就行。
内容的提问来源于stack exchange,提问作者marcuspetty
相关产品推荐
相关产品推荐

