JavaScript实现罗马数字转整数时console.log无输出问题排查
问题排查与修正
核心错误清单
- 对象键重复&映射错误:重复定义了
IV键,后定义的IV:9会覆盖之前的IV:4,数值9对应的正确罗马字符为IX。此外你注释的IL/IC/ID/IM都不是合法罗马特殊组合,合法的特殊组合仅为IV、IX、XL、XC、CD、CM6种 - 逻辑方向倒置:你当前写的是「整数转罗马数字」的逻辑,但题目要求是「罗马数字转整数」。入参
s是输入的罗马字符串,你直接用字符串和数值做比较,JS会隐式转换为NaN,所有比较结果都是false,自然不会进入while分支;如果你没有主动调用过romanToNum函数,for循环根本不会执行,console.log自然没有任何输出 - 逻辑缺陷:for...in遍历对象的默认顺序不符合数值从大到小的要求,同时函数末尾没有返回计算结果,执行后拿不到返回值
罗马数字转整数 正确实现
function romanToInt(s) { const romanMap = { 'I': 1, 'V': 5, 'X': 10, 'L': 50, 'C': 100, 'D': 500, 'M': 1000 }; let result = 0; for (let i = 0; i < s.length; i++) { // 当前位数值小于下一位时做减法,否则做加法 if (i < s.length - 1 && romanMap[s[i]] < romanMap[s[i+1]]) { result -= romanMap[s[i]]; } else { result += romanMap[s[i]]; } } return result; } // 调用示例,主动调用后才会触发函数内部逻辑 console.log(romanToInt('III')) // 输出3 console.log(romanToInt('IV')) // 输出4 console.log(romanToInt('MCMXCIV')) // 输出1994
如果你需要的是整数转罗马数字的修正版
function intToRoman(num) { // 按数值从大到小排序,避免遍历顺序错误 const valueMap = [ ['M', 1000], ['CM', 900], ['D', 500], ['CD', 400], ['C', 100], ['XC', 90], ['L', 50], ['XL', 40], ['X', 10], ['IX', 9], ['V', 5], ['IV', 4], ['I', 1] ]; let result = ''; for (const [char, value] of valueMap) { while (num >= value) { result += char; num -= value; } } return result; } console.log(intToRoman(3)) // 输出III console.log(intToRoman(1994)) // 输出MCMXCIV
内容的提问来源于stack exchange,提问作者JiwanJeon94
相关产品推荐
相关产品推荐

