JavaScript交作业:十进制数字转罗马数字

HomeWork for [freecodecamp.org]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
function convertToRoman(num) {
// 通过obj观察罗马数的规律,罗马数字是没有0的,实际列表写到9即可
let obj = {
I: 1,
II: 2,
III: 3,
IV: 4,
V: 5,
VI: 6,
VII: 7,
VIII: 8,
IX: 9,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
}
//十进制4位数以内,罗马数字用到的字符从小到大排列
let s = ["I", "V", "X", "L", "C", "D", "M"]

// let s1=["I","X","C","M"] //1,10,100,1000
// let s2=["V","L","D"] // 5,50,500只有一个字符

let values = Object.values(obj)//获取罗马数字对应的十进制数字列表
let keys = Object.keys(obj)//获取十进制数字对应的罗马数字列表

//将输入的十进制数字"分拆"成单个[0-9]的字符转成列表后反转(让个位数在第一个位置),并将字符转换成数字
let arr = String(num).split("").reverse().map(item => Number(item))

for (let i = 0, n =0; i < arr.length; i++, n+=2) {
//判断数字中有没有0
if(arr[i]!==0){
//没有0的话,从obj中反查对应的罗马数字,并将罗马数组分拆成[I-X]字符列表
arr[i] = keys[values.indexOf(arr[i])].split("")

for(let j = 0; j < arr[i].length; j++) {
//每循环一次,代表*10,s列表的字符升级2位(n+2)
arr[i][j]=s[s.indexOf(arr[i][j])+n]
}

arr[i] = arr[i].join("")

}
else{
arr[i]==="0"
}

}
//把多余的"0"去掉返回最终结果
return arr.reverse().join("").replace(/0/g,"")

}

console.log(convertToRoman(500));