如何用Lodash或原生JavaScript实现求职板的多级排序?
更简洁高效的函数式实现方案
你的分组思路逻辑是通顺的,但其实不需要这么繁琐——我们可以直接利用多条件排序一步完成需求,不管是原生JavaScript还是Lodash都有非常简洁的实现方式,代码可读性和维护性会更好。
一、原生JavaScript实现(纯函数式写法)
原生的Array.filter() + Array.sort()组合就能搞定,完全不需要分组操作:
// 过滤掉标签匹配数为0的职位,再执行多条件排序 const sortedJobs = jobs .filter(job => job.tagCount > 0) .sort((a, b) => { // 第一优先级:标签匹配数降序 if (b.tagCount !== a.tagCount) { return b.tagCount - a.tagCount; } // 第二优先级:发布时间降序(日期值越大代表越新) return b.date - a.date; });
为什么这个方式更优?
- 代码极简:无需分组、合并等额外步骤,逻辑直接清晰
- 性能高效:仅需两次遍历(过滤+排序),比分组方案的多次遍历更节省资源
- 纯函数风格:
filter和sort都是无副作用的纯函数,契合函数式编程理念
用你的输入示例测试(模拟日期顺序):
const DateA = new Date('2024-01-01'); const DateB = new Date('2024-01-02'); const DateC = new Date('2024-01-03'); const DateD = new Date('2024-01-04'); // 假设D是最新的日期 const jobs = [ { tagCount: 2, date: DateA}, { tagCount: 2, date: DateB}, { tagCount: 1, date: DateC}, { tagCount: 3, date: DateD}, ]; console.log(sortedJobs); // 输出完全匹配你的预期: // [ { tagCount: 3, date: DateD}, { tagCount: 2, date: DateB}, { tagCount: 2, date: DateA}, { tagCount: 1, date: DateC} ]
二、Lodash实现(更语义化的写法)
如果你的项目已经引入Lodash,那_.orderBy函数可以让代码更简洁,它原生支持多字段、多方向排序:
const sortedJobs = _.orderBy( _.filter(jobs, job => job.tagCount > 0), // 先过滤无效职位 ['tagCount', 'date'], // 排序字段列表 ['desc', 'desc'] // 对应字段的排序方向(均为降序) );
优势:
- 语义化极强:一眼就能看懂是按
tagCount降序、再按date降序排序 - 无需手动写比较逻辑:Lodash封装了多条件排序的细节,减少出错概率
对比你的原思路
你的分组思路是可行的,但存在冗余:需要先按tagCount分组、组内排序、再按tagCount降序合并各组。而上面的两种方案直接通过排序一步完成需求,代码量减少至少一半,维护成本更低。
内容的提问来源于stack exchange,提问作者UVic
相关产品推荐
相关产品推荐

