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"的判断条件。 - 条件判断语法错误:
- 你写的
(sToIndex[i + 1] === "V" || "X")不符合JS逻辑规则,非空字符串"X"布尔值恒为真,该条件等价于只要sToIndex[i]是"I"就直接成立,和后一位字符无关,正确写法需要明确写出两边的等值判断:(sToIndex[i + 1] === "V" || sToIndex[i + 1] === "X"),后续几个判断的|| "L"、|| "M"都是同类错误。 - 判断逻辑与错误使用了按位与
&,应该用逻辑与&&。 - 调用了不存在的API:JS中获取对象键集合的方法是
Object.keys(),不存在Object.key()方法,直接调用会抛错;且sToIndex本身就是拆分好的字符数组,不需要额外套Object.keys()再取下标。
- 你写的
- 业务逻辑错误:
- 除第一个if分支外,其余分支都写了直接
return integer,只要进入分支就会立刻终止函数,根本无法遍历完整个字符串。 - 取值逻辑完全依赖无意义的j下标:
Object.values(romanNumerals)[j + 1]和当前遍历的字符没有绑定关系,计算出的值完全随机,直接通过键名取映射值即可,不需要遍历对象值列表。 - CD、CM组合(对应400、900)的计算逻辑写的是减10,实际应该减100。
- 匹配到双字符特殊组合后没有手动给i+1,会导致下一轮循环重复处理已经算过的字符。
- 除第一个if分支外,其余分支都写了直接
保留原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
相关产品推荐
相关产品推荐

