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

如何将含日期属性的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 15:13:23