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

如何从JavaScript对象中获取最小与最大日期?是否有内置函数?

如何从给定对象中找出最小和最大日期

核心思路

由于你的日期是YYYY-MM-DD的ISO格式字符串,这种格式的字符串可以直接通过字典序比较判断时间先后(年份、月份、日期的顺序与时间顺序完全一致),无需额外转换为Date对象也能准确比较。

步骤1:提取所有目标日期

首先需要把对象中所有需要比较的日期(比如仅startDate,或同时包含startDate和endDate)提取到一个数组中:

示例代码(提取所有日期)

const eventData = {
  "2010": [{"id":1243,"eventName":"sample_01","categoryType":"CUSTOM_NOTES","tags":"tag19","startDate":"2010-02-24","endDate":"2010-02-26","attachments":[]}],
  "2022": [{"id":1244,"eventName":"sample_02","categoryType":"CUSTOM_NOTES","tags":"tag1, tag12, tag3, tag52, tag19","startDate":"2022-10-04","endDate":"2022-12-12","attachments":[]},{"id":1245,"eventName":"hello_03","categoryType":"CUSTOM_NOTES","tags":"tag1, tag12","startDate":"2022-06-01","endDate":"2010-06-26","attachments":[]}]
};

// 提取所有startDate和endDate
const allDates = Object.values(eventData)
  .flatMap(yearGroup => yearGroup) // 展开所有年份的事件数组
  .flatMap(event => [event.startDate, event.endDate]); // 提取每个事件的两个日期

// 若只需要startDate,用下面的代码
const allStartDates = Object.values(eventData)
  .flatMap(yearGroup => yearGroup)
  .map(event => event.startDate);

步骤2:计算最小和最大日期

可以通过两种方式实现:

方法1:直接利用字符串比较(推荐,无需转换Date)

利用数组的reduce方法遍历比较:

// 计算最小日期
const minDate = allDates.reduce((currentMin, date) => {
  return date < currentMin ? date : currentMin;
}, allDates[0]);

// 计算最大日期
const maxDate = allDates.reduce((currentMax, date) => {
  return date > currentMax ? date : currentMax;
}, allDates[0]);

console.log('最小日期:', minDate); // 输出 "2010-02-24"
console.log('最大日期:', maxDate); // 输出 "2022-12-12"

如果只关注startDate,替换allDates为allStartDates,就能得到你预期的结果:

const minStartDate = allStartDates.reduce((currentMin, date) => date < currentMin ? date : currentMin, allStartDates[0]);
const maxStartDate = allStartDates.reduce((currentMax, date) => date > currentMax ? date : currentMax, allStartDates[0]);

console.log('最小startDate:', minStartDate); // "2010-02-24"
console.log('最大startDate:', maxStartDate); // "2022-10-04"

方法2:转换为时间戳后用Math内置函数

如果习惯用数字比较,可以把日期转成时间戳(毫秒数),再用Math.min和Math.max计算:

const timestamps = allDates.map(date => Date.parse(date));
const minTimestamp = Math.min(...timestamps);
const maxTimestamp = Math.max(...timestamps);

// 转换回YYYY-MM-DD格式
const minDate = new Date(minTimestamp).toISOString().split('T')[0];
const maxDate = new Date(maxTimestamp).toISOString().split('T')[0];

关于内置函数的问题

JavaScript没有直接针对这种嵌套对象提取日期并求最值的单一内置函数,但可以通过组合以下内置方法实现需求:

  • Object.values():提取对象的所有值
  • Array.flatMap()/Array.map():遍历并提取日期
  • Array.reduce():遍历比较求最值
  • Math.min()/Math.max():针对时间戳求最值

对你现有代码的修正

你提供的filterEventsByDates函数存在问题:filterDateFn返回的是localeCompare的结果(-1/0/1),而Array.filter()需要回调返回布尔值,这会导致所有元素都被保留(非0数字会被转为true)。如果你的需求是对事件按日期排序,应该用Array.sort()而非filter():

filterEventsByDates = () => {
  const sortDateFn = (a, b) => a.startDate.localeCompare(b.startDate);
  setDateFiltersToState(sortDateFn);
}

setDateFiltersToState = (sortDateFn) => {
  this.setState(state => {
    const events = {};
    for (const [year, items] of Object.entries(state.events)) {
      events[year] = items.slice().sort(sortDateFn); // 替换filter为sort
    }
    return { events };
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:10:56