Lodash自定义条件筛选季度月份问题及Moment方案咨询
解决按季度筛选月份数组的问题
先说说你的Lodash方案为什么无效
你提到返回Lodash包装器而非筛选后的数组,大概率是这两个原因:
- 链式调用未收尾+方法名写错:如果你用了
_.chain()开头的链式写法,必须用.value()(不是你尝试的.values()哦!这个方法是用来提取对象的键值数组的,和链式收尾无关)来拿到最终的原始数组。比如正确的链式写法应该是:const filteredMonths = _.chain(months) .slice(0, 3) // 注意:slice是左闭右开,取季度1要写到索引3而非2 .value(); - slice参数逻辑错误:你示例里用
0和2作为slice参数,但_.slice(arr, start, end)的end是不包含的索引,要取一月、二月、三月(对应数组前3个元素),得传0和3——不然只会得到前两个元素,再加上链式调用的收尾问题,就容易出现返回包装器的情况。
如果不想用链式写法,直接调用_.slice(months, 0, 3)就能直接得到筛选后的数组,完全不需要处理包装器。
用Moment实现更简便的方案
既然你的项目已经在用Moment,那可以直接利用它内置的方法一步到位:
Moment提供了moment.months()方法(支持多语言,比如中文用moment.months('zh-cn')),直接返回按顺序排列的12个月份名称数组。我们只需要根据季度计算起始和结束索引即可:
function getMonthsByQuarter(quarter) { // 季度从1到4,计算起始索引:(季度-1)*3 const startIndex = (quarter - 1) * 3; // 结束索引是起始+3(因为slice左闭右开) const endIndex = startIndex + 3; // 直接用Moment的月份数组切片 return moment.months('zh-cn').slice(startIndex, endIndex); } // 调用示例:获取季度1的月份 console.log(getMonthsByQuarter(1)); // 输出 ["一月", "二月", "三月"]
如果你的月份数组是自己定义的(不是Moment生成的),只要它是按1-12月顺序排列的,同样可以用这个索引计算逻辑来切片筛选,完全不用复杂的条件判断。
内容的提问来源于stack exchange,提问作者Aligator
相关产品推荐
相关产品推荐

