0

我是在 Javascript 中研究罗马数字 Kata 的新手。所有规格都通过了。我已经重构了规范文件,现在正在尝试重构主文件。

以前的样子是这样的:

function roman(number) {
  var conversion = ''

  if (number == 100){
    conversion += 'C'
    number -= 100
  }
// omitted code

  while (number >= 1){
   conversion += 'I'
   number -= 1
 }

return conversion
}

现在看起来像这样:

function roman(number) {

  var denominations = {

    100: 'C',
    // omitted code
    5: 'V',
    4: 'IV',
    1: 'I'

  }

  var conversions = ''

  _.each(denominations, function(roman_num, natural_num) {
    while (number >= natural_num){ 
      conversions = conversions + roman_num
      number -= natural_num
    }
  })
  return conversions
}

我花了一些时间通过 Chrome 使用 JS 控制台进行调试,它看起来不像迭代每个面额,而是卡在 1 上。

我也在使用 Jasmine,所以我的错误如下所示:

Expected 'IIII' to equal 'IV'
Expected 'IIIII' to equal 'V'

等等。

所以我的问题是: 1. 为什么只返回 1、'I' 和 2 的值会卡住。我该如何解决?

提前致谢!

4

1 回答 1

0

JavaScript 对象是以字符串为索引的 HashMap。因此,“_.each”中元素的顺序并不保证与声明的相同。您应该使用像 Array 一样保证顺序的结构。

function roman(number) {
  var denominations_natural = [100, 5, 4, 1];
  var denominations_roman = ["C", "V", "IV", "I"];

  var conversions = '';

  for (var i=0; i<denominations_natural.length; i++) {
    while (number >= denominations_natural[i]) {
      conversions += denominations_roman[i];
      number -= denominations_natural[i];
    }
  }

  return conversions;
}
于 2014-01-29T01:19:53.033 回答