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

Angular4中如何按日期排序对象数组?排序失效求助

问题根源与解决方案

嘿,这问题我太熟了!你排序失败的核心原因是日期格式解析错误。

为什么你的排序不生效?

你用的日期格式是DD-MM-YYYY(日-月-年),但JavaScript的new Date()默认会把这种格式当成MM-DD-YYYY(月-日-年)来解析——这就麻烦了:

  • 比如04-05-2018会被错误解析成2018年4月5日(而不是你想要的5月4日)
  • 更糟的是像29-03-2018这种日数大于12的日期,浏览器会直接判定为无效日期(因为没有第29个月份),排序时无效日期和正常日期的差值会变成NaN,自然就排不出正确顺序了。

两种可行的修复方案

方案1:手动拆分日期构造Date对象

直接把日期字符串拆成年、月、日,按new Date(年, 月索引, 日)的格式构造(注意月份索引是从0开始的,所以要减1):

this.filteredData.sort(function(a, b) {
  // 拆分日期字符串为日、月、年数组
  const [dayA, monthA, yearA] = a.date.split('-');
  const [dayB, monthB, yearB] = b.date.split('-');
  
  // 构造正确的Date对象
  const dateA = new Date(yearA, monthA - 1, dayA);
  const dateB = new Date(yearB, monthB - 1, dayB);
  
  // 降序排序(如果要升序就反过来写 dateA - dateB)
  return dateB - dateA;
});

方案2:转换为ISO标准日期格式

把DD-MM-YYYY转换成YYYY-MM-DD(ISO标准格式),这种格式new Date()能完美解析:

this.filteredData.sort(function(a, b) {
  // 定义格式转换函数
  const toISOFormat = dateStr => {
    const [day, month, year] = dateStr.split('-');
    return `${year}-${month}-${day}`;
  };
  
  const dateA = new Date(toISOFormat(a.date));
  const dateB = new Date(toISOFormat(b.date));
  
  return dateB - dateA;
});

额外提醒

JavaScript对非标准日期格式的解析行为是浏览器依赖的,所以永远不要直接把DD-MM-YYYY这种格式丢给new Date(),手动处理格式才是最稳妥的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:42:04