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

使用Lodash sortBy排序年月字符串数组失效原因及降序需求咨询

问题分析与解决方案

我来帮你拆解下这个排序失效的原因,以及对应的解决办法:

首先,你的排序逻辑核心问题出在 Lodash _.sortBy 的默认行为上:

  1. _.sortBy 只做升序排序
    你想要的是从最新到最旧的降序排列,但_.sortBy会始终按照你返回的排序键(这里是拆分后的[年份, 月份]数组)进行从小到大的升序排序。所以你当前的代码其实能正确完成「从旧到新」的排序,只是和你的需求方向完全相反。

  2. 你的排序键逻辑是对的
    把字符串拆分成数字类型的年份和月份作为排序依据,这个思路没问题,只是没考虑到_.sortBy的方向限制。


两种可行的解决方法

方法1:先升序排序,再反转数组

既然_.sortBy能给出正确的升序结果,我们只需要用_.reverse反转数组就能得到降序效果:

let data = ["2018-1", "2018-5", "2018-11", "2018-2", "2018-10", "2018-12"];

// 先得到「旧→新」的升序数组
const sortedAsc = _.sortBy(data, (item) => {
  const [year, month] = item.split("-").map(Number);
  return [year, month];
});

// 反转得到「新→旧」的降序数组
const result = _.reverse(sortedAsc);
// 输出:["2018-12", "2018-11", "2018-10", "2018-5", "2018-2", "2018-1"]

方法2:直接用_.orderBy指定降序(更推荐)

Lodash的_.orderBy支持直接指定排序方向,一步到位完成降序排序,比先排序再反转更直观:

let data = ["2018-1", "2018-5", "2018-11", "2018-2", "2018-10", "2018-12"];

const result = _.orderBy(data, 
  // 排序优先级:先按年份,再按月份
  [(item) => Number(item.split("-")[0]), (item) => Number(item.split("-")[1])],
  // 排序方向:年份降序,月份降序
  ['desc', 'desc']
);
// 输出同样是目标结果:["2018-12", "2018-11", "2018-10", "2018-5", "2018-2", "2018-1"]

或者更简洁的写法,把排序键合并为一个数组返回:

const result = _.orderBy(data, (item) => {
  const [year, month] = item.split("-").map(Number);
  return [year, month];
}, ['desc', 'desc']);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:25:10