将数字转换为罗马数字
convert number into roman numerals
实施的 while 循环正在成为一个潜在的无限循环 here.And 如果我使用递减 for 循环实施它,即 for(var i=arrayLen-1;i>=0;i--) 那么它有效 fine.What 是这里的问题吗?
function convertToRoman(num) {
var roman = "";
var lookupObj = {
1000:"M",
900:"CM",
500:"D",
400:"CD",
100:"C",
90:"XC",
50:"L",
40:"XL",
10:"X",
9:"IX",
4:"IV",
5:"V",
1:"I",
};
var arrayLen = Object.keys(lookupObj).length;
while(num>0){
for (var i=0 ; i<arrayLen ; i++){
if(num >= Object.keys(lookupObj)[i]){
roman = roman + lookupObj[Object.keys(lookupObj)[i]];
num = num - Object.keys(lookupObj)[i];
break;
}
}
}
return roman;
}
convertToRoman(1231);
您的代码问题:
您从第一个索引开始
for (var i=0 ; i<arrayLen ; i++)
所以?
Object.keys(lookupObj)[i]
发生这种情况并给出 1
因为带有数字键的对象按数字的升序排序。
的结果:Object.keys(lookupObj)
Object.keys(lookupObj)
// ["1", "4", "5", "9", "10", "40", "50", "90", "100", "400", "500", "900", "1000"]
Object.keys():键的顺序:
- 数字键首先按升序排序(即使存在其他键)。
- 字符串键按创建顺序排序。
- 最后,符号按创建顺序排序
如果你的对象是这样的:
var lookupObj = {
1000:"M",
Z: 'is the last alphabet',
Apples: 'keep the doctors away',
900:"CM",
500:"D",
400:"CD",
100:"C",
90:"XC",
50:"L",
40:"XL",
10:"X",
9:"IX",
4:"IV",
5:"V",
1:"I",
};
这样做的结果是
["1", "4", "5", "9", "10", "40", "50", "90", "100", "400", "500", "900", "1000", "Z", "Apples"]
PS:我没有使用过可迭代对象,但我知道它们也会影响键顺序。我会添加一个 link here.
评论中提到的其他要点:
var arrayLen = Object.keys(lookupObj).length; // [1]
while(num>0){
for (var i=0 ; i<arrayLen ; i++) {
if(num >= Object.keys(lookupObj)[i]) { // [2]
roman = roman + lookupObj[Object.keys(lookupObj)[i]]; // [3]
num = num - Object.keys(lookupObj)[i]; // [4]
break;
}
}
}
您正在调用同一个函数 4 次,您可以将值保存在变量中。
var lookupAsArray = Object.keys(lookupObj)
while(num>0) {
for (var i=0 ; i< lookupAsArray; i++) { // This line is optimised by browsers
if(num >= lookupAsArray[i]) { // so is faster than it seems
roman = roman + lookupObj[lookupAsArray[i]];
num = num - lookupAsArray[i];
break;
}
}
}
实施的 while 循环正在成为一个潜在的无限循环 here.And 如果我使用递减 for 循环实施它,即 for(var i=arrayLen-1;i>=0;i--) 那么它有效 fine.What 是这里的问题吗?
function convertToRoman(num) {
var roman = "";
var lookupObj = {
1000:"M",
900:"CM",
500:"D",
400:"CD",
100:"C",
90:"XC",
50:"L",
40:"XL",
10:"X",
9:"IX",
4:"IV",
5:"V",
1:"I",
};
var arrayLen = Object.keys(lookupObj).length;
while(num>0){
for (var i=0 ; i<arrayLen ; i++){
if(num >= Object.keys(lookupObj)[i]){
roman = roman + lookupObj[Object.keys(lookupObj)[i]];
num = num - Object.keys(lookupObj)[i];
break;
}
}
}
return roman;
}
convertToRoman(1231);
您的代码问题:
您从第一个索引开始
for (var i=0 ; i<arrayLen ; i++)
所以?
Object.keys(lookupObj)[i]
发生这种情况并给出 1
因为带有数字键的对象按数字的升序排序。
的结果:Object.keys(lookupObj)
Object.keys(lookupObj)
// ["1", "4", "5", "9", "10", "40", "50", "90", "100", "400", "500", "900", "1000"]
Object.keys():键的顺序:
- 数字键首先按升序排序(即使存在其他键)。
- 字符串键按创建顺序排序。
- 最后,符号按创建顺序排序
如果你的对象是这样的:
var lookupObj = {
1000:"M",
Z: 'is the last alphabet',
Apples: 'keep the doctors away',
900:"CM",
500:"D",
400:"CD",
100:"C",
90:"XC",
50:"L",
40:"XL",
10:"X",
9:"IX",
4:"IV",
5:"V",
1:"I",
};
这样做的结果是
["1", "4", "5", "9", "10", "40", "50", "90", "100", "400", "500", "900", "1000", "Z", "Apples"]
PS:我没有使用过可迭代对象,但我知道它们也会影响键顺序。我会添加一个 link here.
评论中提到的其他要点:
var arrayLen = Object.keys(lookupObj).length; // [1]
while(num>0){
for (var i=0 ; i<arrayLen ; i++) {
if(num >= Object.keys(lookupObj)[i]) { // [2]
roman = roman + lookupObj[Object.keys(lookupObj)[i]]; // [3]
num = num - Object.keys(lookupObj)[i]; // [4]
break;
}
}
}
您正在调用同一个函数 4 次,您可以将值保存在变量中。
var lookupAsArray = Object.keys(lookupObj)
while(num>0) {
for (var i=0 ; i< lookupAsArray; i++) { // This line is optimised by browsers
if(num >= lookupAsArray[i]) { // so is faster than it seems
roman = roman + lookupObj[lookupAsArray[i]];
num = num - lookupAsArray[i];
break;
}
}
}