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

如何解决含条件判断的循环方法中的Long溢出错误?

问题分析与解决建议

错误根源

你遇到的long overflow错误,是因为处理number字段的字符串值"567553218"时调用了Date.parse()。部分JS引擎会将这个纯数字字符串判定为无效日期并返回NaN,但GraalVM的JS引擎会尝试将其解析为日期相关数值,最终计算出的时间戳超出了Java 64位有符号long的范围,导致溢出异常。

同时原函数的逻辑存在漏洞:if (isNaN(actualDate) || !(isNaN(actual[key])))的判断逻辑没有正确处理非日期字段,既没有对比actual和expected的字段值,也没有正确设置checkForMatch的结果。

解决步骤与优化代码

核心修复思路

  1. 精准定位日期字段:只对明确是日期类型的字段(比如hitDate)执行日期解析和校验,避免对非日期字段调用Date.parse。
  2. 前置日期格式校验:用正则先验证日期字符串格式,减少无效解析操作。
  3. 修复匹配逻辑:非日期字段直接对比值,确保checkForMatch结果准确。

修改后的代码

var actual = {
  "nameTag": "abc123",
  "number": "567553218",
  "hitDate": "2022-12-09"
};

var expected = {
  "nameTag": "abc123",
  "number": "567553218",
  "hitDate": "2022-12-09"
};

// 指定需要处理日期的字段
const DATE_FIELDS = ['hitDate'];
// 校验YYYY-MM-DD格式的正则
const DATE_FORMAT_REGEX = /^\d{4}-\d{2}-\d{2}$/;

function matchVar(actual, expected) {
  const matchResults = [];
  const now = new Date();
  const dateNow = new Date(now.getTime() + now.getTimezoneOffset() * 60000);

  for (const key in actual) {
    let checkForMatch = false;

    // 先检查expected是否包含当前字段
    if (!expected.hasOwnProperty(key)) {
      matchResults.push(false);
      continue;
    }

    // 处理日期字段
    if (DATE_FIELDS.includes(key) && DATE_FORMAT_REGEX.test(actual[key])) {
      const actualDate = Date.parse(actual[key]);
      if (!isNaN(actualDate)) {
        // 对比时间戳(确保类型一致)
        checkForMatch = actualDate <= dateNow.getTime();
      }
    } else {
      // 非日期字段直接对比值
      checkForMatch = actual[key] === expected[key];
      if (checkForMatch) {
        console.log(`Match found for key: ${key}`);
      }
    }

    matchResults.push(checkForMatch);
  }
  return matchResults;
}

console.log(matchVar(actual, expected));

关键修改点说明

  • DATE_FIELDS:明确指定需要处理日期的字段,避免对number这类非日期字段执行无效的日期解析。
  • DATE_FORMAT_REGEX:提前校验日期格式,只有符合格式的字符串才会调用Date.parse,减少异常触发概率。
  • 修复匹配逻辑:非日期字段直接对比actual[key]和expected[key]的取值,确保checkForMatch结果符合预期。
  • 日期对比时使用dateNow.getTime():和Date.parse返回的毫秒级时间戳保持类型一致,避免隐式转换导致的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:55:13