如何从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
相关产品推荐
相关产品推荐

