// TODO: create a RomanNumerals helper objectlet RomanNumerals ={// 计算百、十、个位数字对应罗马数字的累加tool:(child, a, b, c, d)=>{let sum ='',
k =0
sum = child /5>=1? a :''let son = child >=5? child -5: child
while(k <Number(son)){
sum += b
k++}if(Number(son)===4){returnNumber(son)!==Number(child)? b + c : b + a
}return sum
},// 转化为阿拉伯数字 (使用function防止this找不到作用域)toRoman:function(num){// 倒置操作为后面做铺垫let reStr =[...`${num}`].reverse().join(''),
arr =[]// 补零操作while(reStr.length <4){
reStr +='0'}// 转化为二维数组区分百、十、个位与千位,并做出还原倒置操作
arr =[[...reStr.substr(0,3)].reverse(),[...reStr.substr(3, reStr.length -1)].reverse().join('')].reverse()// 打印出入参和自定义二维数组[String, Array]
console.log(num, arr)return arr.map((item, i)=>{// 对自定义二维数组进行处理if(i ===0){let j =0,
sum =''while(j <Number(item)){
sum +='M'
j++}return sum
}else{// 对百、十、个位的数字进行处理return item.map((child, j)=>{if(j ===0){returnthis.tool(child,'D','C','M')}elseif(j ===1){returnthis.tool(child,'L','X','C')}else{returnthis.tool(child,'V','I','X')}})}// 转化完成并降维,转化为字符串}).flat(1).join('')},// 转化为罗马数字fromRoman:(roman)=>{
console.log(roman)return[...roman].map(item=>{// 将罗马数字的每一位转化为数字处理switch(item){case'M':return1000break;case'D':return500break;case'C':return100break;case'L':return50break;case'X':return10break;case'V':return5break;case'I':return1break;}}).reduce((total, cur, i, recent)=>{// 进行累增获累减操作并返回结果return cur < recent[i +1]? total - cur : total + cur
},0)}}// 可进行更多测试,测试区间[1-10000],10000+暂未验证合理性
console.log(RomanNumerals.toRoman(3440))
console.log(RomanNumerals.fromRoman('IV'))