在Javascript中重构Roman Numeral Kata

时间:2014-01-29 00:58:00

标签: javascript refactoring jasmine underscore.js roman-numerals

我是新手在Javascript中使用Roman Numeral Kata。 所有规格都在流逝。我重构了spec文件,现在正在尝试重构主文件。

过去看起来像这样:

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的值,'我' 和 2.我该如何解决?

提前致谢!

1 个答案:

答案 0 :(得分: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;
}