Javascript 把数字转换成罗马数字

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

这里实现的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:"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;
        }
      }
    }