Javascript 把数字转换成罗马数字
这里实现的while循环正在成为一个潜在的无限循环。如果我使用递减for循环来实现它,即for(var I=arrayLen-1;I>=0;I--),那么它工作得很好。这里的问题是什么Javascript 把数字转换成罗马数字,javascript,algorithm,for-loop,roman-numerals,Javascript,Algorithm,For Loop,Roman Numerals,这里实现的while循环正在成为一个潜在的无限循环。如果我使用递减for循环来实现它,即for(var I=arrayLen-1;I>=0;I--),那么它工作得很好。这里的问题是什么 function convertToRoman(num) { var roman = ""; var lookupObj = { 1000:"M", 900:"CM", 500:"D", 400:"CD", 100:"C", 90:"XC", 50:"L", 40
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;
}
函数转换器(num){
var roman=“”;
var lookupObj={
1000:“米”,
900:“厘米”,
500:“D”,
400:“CD”,
100:“C”,
90:“XC”,
50:“L”,
40:“XL”,
10:“X”,
9.“九”,
4.“四”,
5:“V”,
1:“我”,
};
var arrayLen=Object.keys(lookupObj).length;
while(num>0){
对于(var i=0;i=Object.keys(lookupObj)[i]){
roman=roman+lookupObj[Object.key(lookupObj)[i]];
num=num-Object.keys(lookupObj)[i];
打破
}
}
}
返回罗马;
}
转炉阿曼(1231) 您的代码存在问题:
您将从第一个索引开始
for (var i=0 ; i<arrayLen ; i++)
这种情况会发生,并给出1
因为带有数字键的对象按数字的升序排序
的结果:Object.keys(lookupObj)
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:我没有使用iterables,但我知道它们也会影响密钥排序。我将添加一个链接
评论中提到的其他要点:
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;
}
}
}
var arrayLen=Object.keys(lookupObj).length;//[1]
while(num>0){
对于(var i=0;i=Object.keys(lookupObj)[i]){/[2]
roman=roman+lookupObj[Object.keys(lookupObj)[i]];//[3]
num=num-Object.keys(lookupObj)[i];//[4]
打破
}
}
}
如果调用同一函数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;
}
}
}
var lookupAsArray=Object.keys(lookupObj)
while(num>0){
对于(vari=0;i=lookupAsArray[i]){//so比看起来快
罗马=罗马+lookupObj[lookupAsArray[i]];
num=num-lookupAsArray[i];
打破
}
}
}
提示:查看console.log(Object.keys(lookupObj))
告诉您的内容。(同样,这不是问题,但是var-keys=Object.keys(lookupObj)
可以避免在同一个对象上调用Object.keys()
四次。)我不明白!请详细说明@nnnnnn您的算法依赖于Object.keys(lookupObj)
返回的数组中项目的顺序。顺序和你想的不一样。(这是我之前的提示会告诉你的。)如果我执行console.log(Object.keys(lookupObj)),那么它将以升序返回值,尽管变量是以降序声明的。为什么呢?@nnnnnn
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;
}
}
}
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;
}
}
}