如何从复杂对象中高效提取并比较最早日期

如何从复杂对象中高效提取并比较最早日期

本文旨在探讨在JavaScript中,如何从包含多个潜在日期值的复杂嵌套对象中,准确高效地提取并找出最早的日期。我们将分析现有方法在处理多源日期比较时的局限性,并提出一种健壮的解决方案,通过统一收集、验证和比较所有有效日期,确保返回的结果始终是最早的那个日期值。

在实际的软件开发中,我们经常需要处理包含日期信息的复杂数据结构。一个常见的需求是从这些分散的日期中找出最早(或最晚)的一个。然而,当数据源多样且存在特定业务逻辑过滤时,实现这一功能可能会遇到挑战。例如,一个方法被设计用于从一个包含 dm1_runouts、dm2_runouts 和 star_runouts 等属性的对象中,根据特定的阈值(如 under_30)和优先级规则,返回最早的预测日期。如果现有实现未能全面比较所有可能的日期来源,就可能导致结果不准确,仅比较了部分而非全部预期的日期值。

现有方法的问题分析

假设我们有一个名为 getEarliestRunout 的函数,其目的是接收一个包含预测日期信息的对象 runout_dates,并返回其中最早的日期。原始实现可能使用了 Object.entries 和 reduce 方法来遍历 runout_dates。然而,如果 reduce 内部的比较逻辑包含过于严格的条件判断,例如:

if(value[`under_${env.STICKER_THRESH[0]}`] && key != non_priority_sticker) {    // ... comparison logic ...}

这里的 key != non_priority_sticker 条件,结合 non_priority_sticker 的动态生成(基于当前年份和 dm1_type),可能导致某些日期源(如 dm1_runouts 或 dm2_runouts 中的一个)被排除在比较之外。这意味着,即使 runout_dates 对象中包含了三个潜在的日期源(dm1_runouts、dm2_runouts、star_runouts),实际比较时可能只考虑了其中两个,从而无法准确找出所有日期中的最小值。

健壮的解决方案:统一收集与比较

为了确保能够从所有符合条件的日期源中找到最早的日期,我们需要采取一种更全面和系统化的方法。核心思想是:

明确所有潜在的日期来源。根据业务规则过滤掉不应参与比较的日期来源。从每个符合条件的日期来源中提取具体的日期字符串。将所有提取到的日期字符串转换为统一的时间戳(毫秒数),并收集到一个数组中。过滤掉无效的日期(如 NaN)。使用 Math.min 找出数组中的最小时间戳。将最小时间戳转换回日期格式,并返回结果。

以下是基于此思想重构 getEarliestRunout 函数的示例代码:

/** * 从给定的运行日期对象中查找最早的日期。 * 该函数会根据特定规则(如优先级贴纸类型)过滤日期来源, * 然后从符合条件的来源中提取指定阈值下的日期,并返回最早的那个。 * * @param {object} runout_dates - 包含不同运行日期类型(如dm1_runouts, dm2_runouts, star_runouts)的对象。 *                                 每个类型的值是一个对象,包含如 `under_30` 等键值对。 * @param {string} dm1_type - 用于确定非优先级贴纸类型的字符串,通常与当前年份相关。 * @returns {{val: number, date: string}} 包含最早日期的时间戳和格式化日期字符串的对象。 *                                        如果没有找到有效日期,则val为Infinity,date为空字符串。 */const getEarliestRunoutComprehensive = (runout_dates = {}, dm1_type = '') => {    try {        const cur_year = new Date().getFullYear();        // 假设 env.STICKER_THRESH[0] 存在并表示一个数字阈值,例如 30        // 实际项目中应确保 env 和 STICKER_THRESH 的定义        const STICKER_THRESHOLD = typeof env !== 'undefined' && env.STICKER_THRESH && env.STICKER_THRESH[0] !== undefined                                  ? env.STICKER_THRESH[0]                                  : 30; // 提供一个默认值以防 env 未定义        // 根据业务逻辑确定非优先级贴纸的前缀        // 例如,如果 dm1_type 与当前年份或下一年份匹配,则 'dm1' 为非优先级        const non_priority_sticker_key_prefix = (dm1_type == cur_year + 1 || dm1_type == cur_year) ? 'dm1' : 'dm2';        const potentialTimestamps = [];        // 定义所有可能包含日期的顶级键        const topLevelKeys = ['dm1_runouts', 'dm2_runouts', 'star_runouts'];        for (const key of topLevelKeys) {            // 从顶级键中提取前缀(例如 'dm1', 'dm2', 'star')            const keyPrefix = key.split('_')[0];            // 应用非优先级贴纸的排除规则            // 如果当前键的前缀与非优先级贴纸的前缀匹配,则跳过此日期来源            if (keyPrefix === non_priority_sticker_key_prefix) {                continue;            }            const runoutData = runout_dates[key]; // 获取对应的日期数据对象            // 检查数据是否存在且为对象类型            if (runoutData && typeof runoutData === 'object') {                // 根据预设的阈值(如 'under_30')提取日期字符串                const dateString = runoutData[`under_${STICKER_THRESHOLD}`];                // 如果日期字符串存在                if (dateString) {                    const date = new Date(dateString);                    // 验证日期是否有效(非 Invalid Date)                    if (!isNaN(date.getTime())) {                        potentialTimestamps.push(date.getTime()); // 将有效日期的时间戳添加到数组                    }                }            }        }        // 如果没有收集到任何有效日期,则返回默认值        if (potentialTimestamps.length === 0) {            return { val: Infinity, date: '' };        }        // 使用 Math.min 找出所有有效时间戳中的最小值        const earliestTimestamp = Math.min(...potentialTimestamps);        const earliestDateObj = new Date(earliestTimestamp);        // 将最早的日期对象格式化为 YYYY-MM-DD 字符串        const formattedDate = earliestDateObj.toISOString().split('T')[0];        return { val: earliestTimestamp, date: formattedDate };    } catch (e) {        // 捕获并记录错误,返回默认值        console.error(`ERROR :: util.getEarliestRunout: ${e} - ${new Date()}`);        return { val: Infinity, date: '' };    }};

示例调用与注意事项

假设 env.STICKER_THRESH 配置为 [30],并且 runout_dates 结构如下:

const env = {    STICKER_THRESH: [30]};const priorityRunouts = {    under_30: '2025-01-15',    under_40: '2025-02-15'};const nonPriorityRunouts = {    under_30: '2024-11-01',    under_40: '2024-12-01'};const starRunouts = {    under_30: '2024-10-20',    under_40: '2024-11-20'};const value = {    dm1_type: new Date().getFullYear().toString(), // 假设当前年份为2024,dm1_type为'2024'    dm2_type: 'some_other_type'};// 假设 priority_sticker 逻辑导致 dm1_runouts 为 priorityRunouts,dm2_runouts 为 nonPriorityRunouts// 并且 dm1_type 为当前年份,则 non_priority_sticker_key_prefix 将是 'dm1'const earliest_runout = getEarliestRunoutComprehensive({    dm1_runouts: value.dm1_type == new Date().getFullYear().toString() ? priorityRunouts : nonPriorityRunouts,    dm2_runouts: value.dm2_type == new Date().getFullYear().toString() ? priorityRunouts : nonPriorityRunouts,    star_runouts: starRunouts}, value.dm1_type);console.log(earliest_runout);// 预期输出:如果 dm1_type 为当前年份,则 dm1_runouts 被视为非优先级而被跳过。// 比较 dm2_runouts (2024-11-01) 和 star_runouts (2024-10-20)。// 最早日期应为 2024-10-20。

注意事项:

日期格式一致性: 确保输入 runout_dates 中 under_X 键对应的日期字符串格式能够被 new Date() 正确解析。推荐使用 ISO 8601 格式(如 YYYY-MM-DD 或 YYYY-MM-DDTHH:mm:ss.sssZ)。env 变量的可用性: 示例代码中使用了 env.STICKER_THRESH[0]。在实际应用中,请确保 env 对象及其属性在函数执行时是可访问的,或者将其作为参数传递。错误处理: 使用 try…catch 块来捕获潜在的运行时错误,例如 new Date() 解析失败或属性访问错误,并提供有意义的错误日志和默认返回值。灵活性: 如果未来需要比较的日期来源或过滤规则发生

以上就是如何从复杂对象中高效提取并比较最早日期的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1514382.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
JavaScript中多日期值比较与最早日期查找的最佳实践
上一篇 2025年12月20日 08:25:22
解决“回到顶部”按钮在滚动时无法显示的问题
下一篇 2025年12月20日 08:25:29

相关推荐

  • 雷军展示现任小米高管团队:12位高管中有9位都是新面孔

    雷军展示现任小米高管团队:12位高管中有9位都是新面孔雷军展示现任小米高管团队:12位高管中有9位都是新面孔雷军展示现任小米高管团队:12位高管中有9位都是新面孔雷军展示现任小米高管团队:12位高管中有9位都是新面孔

    9月25日消息,今晚,2025雷军年度演讲正式开启。 演讲初始,雷军向大家展示了目前小米的高管团队。 他表示,小米12位高管里有9位是新面孔,当年一起创业喝小米粥的人,现在只有林斌和刘德还在,其他的高管都是从外部引进,或者从中层提拔的。 雷军表示,这些同事为过去几年小米的发展做出了巨大的贡献,要特别…

    2026年9月28日 • 用户投稿
    000
  • 【Linux/C++】Linux下C++命令行编译示例

    本文是关于c++++编程语言基础和linux系统操作基础的系列文章的第二部分。我们将详细介绍在linux环境下如何编译c++代码,并展示相关的编译示例和技巧。 文章目录 准备源代码编译实战引入目录进行编译使用-Wall、-std 参数进行编译生成库文件链接静态库生成可执行文件链接动态库生成可执行文件…

    2026年9月27日
    100
  • 高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单

    高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单高通:95%的用户愿为搭载骁龙心片的高端手机溢价买单

    在骁龙峰会2025上,高通高级副总裁don mcguire表示,最新调研显示,84%的消费者认为搭载骁龙处理器的笔记本表现出色,具备强大性能;同时,95%的用户愿意为配备骁龙移动平台的高端智能手机支付更高价格。 据CNMO了解,骁龙品牌在多个市场已展现出强劲影响力。根据CyberMedia Rese…

    2026年9月27日 • 用户投稿
    000
  • 就业培训里PHP+MySQL安全开发的讲解深度

    php+mysql安全开发的讲解深度应包括:1)基础安全措施的详细讲解,2)常见攻击类型和防范方法的深入探讨,3)最佳实践和开发习惯的培养,以提升学员的技术技能和安全意识。 在就业培训中,关于PHP+MySQL安全开发的讲解深度是一个非常关键的话题。这不仅关系到学员能否掌握必要的技能,也直接影响到他…

    2026年9月27日
    000
  • win10服务主机本地系统占用CPU过高_Svchost.exe进程导致CPU占用率高的解决方法

    win10服务主机本地系统占用CPU过高_Svchost.exe进程导致CPU占用率高的解决方法win10服务主机本地系统占用CPU过高_Svchost.exe进程导致CPU占用率高的解决方法win10服务主机本地系统占用CPU过高_Svchost.exe进程导致CPU占用率高的解决方法win10服务主机本地系统占用CPU过高_Svchost.exe进程导致CPU占用率高的解决方法

    首先定位高CPU占用的svchost.exe进程,通过任务管理器“详细信息”选项卡排序CPU使用率,右键高占用进程选择“转到服务”以识别具体关联服务;接着禁用常引发问题的Connected User Experiences and Telemetry(DiagTrack)服务,并将Windows U…

    2026年9月27日 • 用户投稿
    200
  • 解决Spring Boot与React应用在AWS部署中CORS错误的终极指南

    解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南解决Spring Boot与React应用在AWS部署中CORS错误的终极指南

    本文旨在解决在Spring Boot后端(AWS EC2)和React前端(AWS S3)部署时,即使服务器端已配置宽松的CORS策略,仍出现跨域资源共享(CORS)错误的问题。我们将深入探讨常见误区,并提供一个将CORS配置与Spring Security有效整合的专业解决方案,同时强调处理wit…

    2026年9月27日 • 用户投稿
    100
  • 一加15首发最强原生165超高帧游戏:阵容前所未有

    一加15首发最强原生165超高帧游戏:阵容前所未有一加15首发最强原生165超高帧游戏:阵容前所未有一加15首发最强原生165超高帧游戏:阵容前所未有一加15首发最强原生165超高帧游戏:阵容前所未有

    9月26日,在一加游戏大会2025上,一加正式宣布一加15迈入165hz超高帧时代。官方表示,165hz超高帧游戏带来前所未有的流畅速度,体验过后便难以回头,堪称手游视效的一次革命性升级。 据了解,165Hz超高帧将从三方面显著提升游戏体验:画面更顺滑流畅、敌情发现更迅速、战斗反应更迅捷。 一加15…

    2026年9月27日 • 用户投稿
    000
  • 无人在意的角落里 PS4多项社交相关功能被悄然移除

    无人在意的角落里 PS4多项社交相关功能被悄然移除无人在意的角落里 PS4多项社交相关功能被悄然移除无人在意的角落里 PS4多项社交相关功能被悄然移除无人在意的角落里 PS4多项社交相关功能被悄然移除

    早在今年三月,索尼已悄然下线了部分PS4的社交功能,然而这一调整并未引发广泛关注。许多玩家认为,PS4或许是PlayStation平台中社交体验最为完善的机型,反观PS5,其社交系统却显得功能匮乏且不够实用。颇具讽刺意味的是,索尼今年从上一代主机中逐步撤除的,正是这些曾广受好评的功能。 根据索尼此前…

    2026年9月27日 • 用户投稿
    000
  • AI绘图工具生成的图片会有版权问题吗?2025解答

    AI绘图工具生成的图片会有版权问题吗?2025解答AI绘图工具生成的图片会有版权问题吗?2025解答AI绘图工具生成的图片会有版权问题吗?2025解答AI绘图工具生成的图片会有版权问题吗?2025解答

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ AI绘图工具生成的图片,其版权归属问题在2025年来看,依旧是一个复杂且不断演进的法律议题,并没有一个简单的“是”或“否”的答案。核心在于,目前主流的法律实践和司法判例倾向于认为,纯粹由AI自主…

    2026年9月27日 • 用户投稿
    000
  • 荣耀推出台风暖心关怀服务,受“桦加沙”影响用户可享免费备用机及清洁等

    荣耀推出台风暖心关怀服务,受“桦加沙”影响用户可享免费备用机及清洁等荣耀推出台风暖心关怀服务,受“桦加沙”影响用户可享免费备用机及清洁等荣耀推出台风暖心关怀服务,受“桦加沙”影响用户可享免费备用机及清洁等荣耀推出台风暖心关怀服务,受“桦加沙”影响用户可享免费备用机及清洁等

    感谢网友 叫什么好 的线索投递! 9 月 26 日消息,9 月 25 日晚,荣耀服务宣布对本次受“桦加沙”台风影响的地区用户,提供多项关怀服务。 整理如下: 免费语音克隆 这是一个提供免费语音克隆服务的平台,用户只需上传或录制一段 5 秒以上的清晰语音样本,平台即可生成与用户声音高度一致的 AI 语…

    2026年9月27日 • 用户投稿
    000
  • Logback:阻止日志输出到控制台,仅保留文件输出

    Logback:阻止日志输出到控制台,仅保留文件输出Logback:阻止日志输出到控制台,仅保留文件输出Logback:阻止日志输出到控制台,仅保留文件输出Logback:阻止日志输出到控制台,仅保留文件输出

    本文档旨在解决Logback在未配置ConsoleAppender的情况下,仍然将日志输出到控制台的问题。通过设置logger的additivity属性为false,可以有效地阻止日志信息继续向上级logger传递,从而实现仅将日志写入文件的目的,避免在控制台产生冗余信息。本文将详细介绍该解决方案,…

    2026年9月27日 • 用户投稿
    100
  • 使用 Gson 和 Kotlin 泛型将数据转换为自定义类

    使用 Gson 和 Kotlin 泛型将数据转换为自定义类使用 Gson 和 Kotlin 泛型将数据转换为自定义类使用 Gson 和 Kotlin 泛型将数据转换为自定义类使用 Gson 和 Kotlin 泛型将数据转换为自定义类

    本文旨在解决在使用 Kotlin 和 Gson 库时,将 JSON 数据反序列化为自定义类,特别是涉及到泛型和 reified 类型参数时可能遇到的问题。核心问题在于类型擦除会导致 Gson 无法正确识别目标类型,从而产生 ClassCastException。本文将深入探讨问题的原因,并提供多种解…

    2026年9月27日 • 用户投稿
    200
  • 华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相

    华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相华为WATCH GT 6系列正式发布:超长续航全能智能手表亮相

    2025年9月24日,华为watch gt 6系列在线上举行的华为穿戴音频新品发布会正式亮相,再次彰显华为在高端智能手表市场的强劲竞争力。 自2018年首代产品问世以来,GT系列始终聚焦长续航、健康监测与运动进阶功能,持续引领智能穿戴创新方向。市场研究机构IDC最新数据显示,2025年第二季度,华为…

    2026年9月27日 • 用户投稿
    200
  • Claude 接管人类电脑 12 小时:学会摸鱼,敲着敲着代码看风景去了

    Claude 接管人类电脑 12 小时:学会摸鱼,敲着敲着代码看风景去了Claude 接管人类电脑 12 小时:学会摸鱼,敲着敲着代码看风景去了Claude 接管人类电脑 12 小时:学会摸鱼,敲着敲着代码看风景去了Claude 接管人类电脑 12 小时:学会摸鱼,敲着敲着代码看风景去了

    新版 claude 3.5 可以像人一样使用计算机,可把咱人类给兴奋坏了! 毕竟,这意味着新竞赛的开始:AI 不再只盯着对话和生成能力,更强调执行和操作。 不到 12 小时,激动的网友们已经纷纷贡献出自己是怎么看着 Claude 玩电脑的。 在 Anthropic 的发布公告中,还有这样一段引起了大…

    2026年9月27日 • 用户投稿
    200
  • sublime怎么设置git为默认的core.editor_sublime设置Git默认编辑器方法

    sublime怎么设置git为默认的core.editor_sublime设置Git默认编辑器方法sublime怎么设置git为默认的core.editor_sublime设置Git默认编辑器方法sublime怎么设置git为默认的core.editor_sublime设置Git默认编辑器方法sublime怎么设置git为默认的core.editor_sublime设置Git默认编辑器方法

    首先确认Sublime Text已添加到系统路径并可通过subl命令启动,然后运行git config –global core.editor “subl -n -w”将其设为默认编辑器,最后通过git config –get core.editor验…

    2026年9月27日 • 用户投稿
    100
  • 控制 JScrollPane 滚动条自动更新行为详解

    控制 JScrollPane 滚动条自动更新行为详解控制 JScrollPane 滚动条自动更新行为详解控制 JScrollPane 滚动条自动更新行为详解控制 JScrollPane 滚动条自动更新行为详解

    本教程将深入探讨如何有效控制 JScrollPane 的滚动条自动更新行为,特别是在内容动态变化时保持滚动条位置不变。通过设置滚动条策略为 NEVER,开发者可以阻止 JScrollPane 自动调整其水平或垂直滚动条的值,从而实现对滚动行为的精确控制,避免不必要的UI跳动,提升用户体验。 JScr…

    2026年9月27日 • 用户投稿
    100
  • Java Stream API处理嵌套对象字段求和:以购物车条目为例

    Java Stream API处理嵌套对象字段求和:以购物车条目为例Java Stream API处理嵌套对象字段求和:以购物车条目为例Java Stream API处理嵌套对象字段求和:以购物车条目为例Java Stream API处理嵌套对象字段求和:以购物车条目为例

    本文深入探讨如何利用Java Stream API高效地对复杂嵌套对象中的数值字段进行聚合求和。通过一个购物车条目的具体案例,演示了如何从多层级对象中提取并累加BigDecimal类型的费用数据,强调了mapToDouble、BigDecimal的精确计算以及在处理可能为空的字段时,结合注解进行nu…

    2026年9月27日 • 用户投稿
    100
  • 如何使用update

    如何使用update如何使用update如何使用update如何使用update

    Update的用法,需要具体代码示例 在编程中,我们经常需要对数据进行更新操作。在许多编程语言和数据库中,都提供了update语句或者update函数来实现数据的更新功能。在本文中,我们将介绍update的用法,并提供具体的代码示例来帮助读者更好地掌握这一技术。 一、update的基本语法 在大多数…

    2026年9月27日 • 用户投稿
    100
  • JScrollPane滚动条自动更新行为的控制策略与实践

    JScrollPane滚动条自动更新行为的控制策略与实践JScrollPane滚动条自动更新行为的控制策略与实践JScrollPane滚动条自动更新行为的控制策略与实践JScrollPane滚动条自动更新行为的控制策略与实践

    本教程详细探讨如何有效控制JScrollPane的滚动条自动更新行为,特别是在内容重绘后避免意外滚动。文章重点介绍通过设置滚动条策略(如ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER)来禁用滚动条或其自动更新,并简要提及Viewport尺寸调整的替代方法…

    2026年9月27日 • 用户投稿
    100
  • C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南C# .NET中基于JWT和外部授权服务器的REST API安全配置指南

    本文旨在提供一个简洁明了的教程,指导开发者如何在C# .NET应用中,以纯资源服务器模式,通过外部授权服务器(如AWS Cognito或Asgardeo)实现REST API的安全保护。文章将重点介绍如何利用JWT Bearer认证机制,通过最小化配置,快速构建一个能够验证传入访问令牌的API服务,…

    2026年9月27日 • 用户投稿
    200

发表回复

登录后才能评论
关注微信