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

JS实现romanToInt判断特殊罗马数字时返回undefined问题

代码错误定位(罗马数字转整数返回undefined问题)

你代码的第一个判断条件从未触发、最终返回undefined,是多层语法+逻辑错误共同导致的,具体问题如下:

  • 内层循环完全不执行:romanNumerals是普通对象,不存在length属性,romanNumerals.length返回值为undefined,循环条件j <= romanNumerals.length -1等价于j <= NaN,循环判定永远不成立,内层代码块从头到尾不会运行,函数没有执行到任何return语句,默认返回undefined。
  • 外层循环边界错误:数组下标从0开始,sToIndex.length是数组长度,循环条件写i <= sToIndex.length会导致i最后一次取值等于数组长度,此时sToIndex[i]为undefined,不可能匹配到"I"的判断条件。
  • 条件判断语法错误:
    1. 你写的(sToIndex[i + 1] === "V" || "X")不符合JS逻辑规则,非空字符串"X"布尔值恒为真,该条件等价于只要sToIndex[i]是"I"就直接成立,和后一位字符无关,正确写法需要明确写出两边的等值判断:(sToIndex[i + 1] === "V" || sToIndex[i + 1] === "X"),后续几个判断的|| "L"、|| "M"都是同类错误。
    2. 判断逻辑与错误使用了按位与&,应该用逻辑与&&。
    3. 调用了不存在的API:JS中获取对象键集合的方法是Object.keys(),不存在Object.key()方法,直接调用会抛错;且sToIndex本身就是拆分好的字符数组,不需要额外套Object.keys()再取下标。
  • 业务逻辑错误:
    1. 除第一个if分支外,其余分支都写了直接return integer,只要进入分支就会立刻终止函数,根本无法遍历完整个字符串。
    2. 取值逻辑完全依赖无意义的j下标:Object.values(romanNumerals)[j + 1]和当前遍历的字符没有绑定关系,计算出的值完全随机,直接通过键名取映射值即可,不需要遍历对象值列表。
    3. CD、CM组合(对应400、900)的计算逻辑写的是减10,实际应该减100。
    4. 匹配到双字符特殊组合后没有手动给i+1,会导致下一轮循环重复处理已经算过的字符。

保留原if判断特殊组合思路的修正代码

var romanToInt = function(s) {
  const romanNumerals = {I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000}
  let integer = 0
  const charArr = s.split("")
  
  for (let i = 0; i < charArr.length; i++ ){
      // 识别4、9
      if (charArr[i] === "I" && (charArr[i + 1] === "V" || charArr[i + 1] === "X")){
         integer += romanNumerals[charArr[i+1]] - 1
         i++ // 跳过已处理的下一位字符
       }
      // 识别40、90
      else if (charArr[i] === "X" && (charArr[i + 1] === "L" || charArr[i + 1] === "C")){
          integer += romanNumerals[charArr[i+1]] - 10
          i++
      }
      // 识别400、900
      else if (charArr[i] === "C" && (charArr[i + 1] === "D" || charArr[i + 1] === "M")){
        integer += romanNumerals[charArr[i+1]] - 100
        i++
      }
      // 普通字符直接累加对应值
      else {
        integer += romanNumerals[charArr[i]]
      }
  }
  return integer
}

console.log(romanToInt("IV")) // 输出4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 10:27:17