使用Lodash sortBy排序年月字符串数组失效原因及降序需求咨询
问题分析与解决方案
我来帮你拆解下这个排序失效的原因,以及对应的解决办法:
首先,你的排序逻辑核心问题出在 Lodash _.sortBy 的默认行为上:
_.sortBy只做升序排序
你想要的是从最新到最旧的降序排列,但_.sortBy会始终按照你返回的排序键(这里是拆分后的[年份, 月份]数组)进行从小到大的升序排序。所以你当前的代码其实能正确完成「从旧到新」的排序,只是和你的需求方向完全相反。你的排序键逻辑是对的
把字符串拆分成数字类型的年份和月份作为排序依据,这个思路没问题,只是没考虑到_.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
相关产品推荐
相关产品推荐

