如何将含日期属性的JS对象数组按指定日期类别排序转换?
解决方案
问题根源在于array.reduce的分组逻辑是按原数组中类别首次出现的顺序生成分组键的,和你需要的固定日期递增顺序无关,所以原数组未排序时,分组后的类别顺序会混乱。
要解决这个问题,核心是先定义固定的日期类别递增顺序列表,再基于这个列表构建最终的分组结果,具体步骤如下:
1. 定义固定的类别顺序
先明确你需要的严格递增的日期类别列表,比如假设getCategoryByDate返回的类别是['今天', '昨天', '本周内', '本月内'],就把这个顺序固化成常量:
// 必须和getCategoryByDate返回的类别值完全匹配,顺序严格按日期递增 const FIXED_CATEGORY_ORDER = ['今天', '昨天', '本周内', '本月内'];
2. 用reduce完成数据分组
先不管顺序,把所有数据按类别分组到一个对象中:
import dayjs from 'dayjs'; // 假设你的订单数组是orders,每个元素有date属性 const groupedDataMap = orders.reduce((map, order) => { const category = getCategoryByDate(dayjs(order.date)); // 初始化该类别的数组(如果不存在) if (!map[category]) { map[category] = []; } map[category].push(order); return map; }, {});
3. 按固定顺序生成最终分组数组
遍历预先定义的类别顺序,从分组对象中取出对应数据,确保顺序严格符合要求:
// 生成最终的分组数组,保留所有类别(无数据则为空数组) const finalGroupedArray = FIXED_CATEGORY_ORDER.map(category => ({ category, data: groupedDataMap[category] || [] })); // 如果需要过滤掉无数据的类别,可追加filter const finalGroupedArrayWithData = finalGroupedArray.filter(item => item.data.length > 0);
关键说明
- 确保
FIXED_CATEGORY_ORDER中的每一项和getCategoryByDate返回的类别字符串完全一致(包括大小写、空格等),否则会出现数据缺失。 - 这种方法不需要预先排序原数组,不管原数组的日期顺序如何,最终的分组类别都会严格遵循你定义的递增顺序。
内容的提问来源于stack exchange,提问作者Rocky
相关产品推荐
相关产品推荐

