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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:26:46