将数字转换为罗马数字

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():键的顺序:

  1. 数字键首先按升序排序(即使存在其他键)。
  2. 字符串键按创建顺序排序。
  3. 最后,符号按创建顺序排序

如果你的对象是这样的:

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;
    }
  }
}