小编典典

使用JavaScript的罗马数字翻译器

algorithm

我在不使用下划线的情况下就可以使用它,但是作为一个额外的挑战,我试图使用下划线将罗马数字转换为阿拉伯数字。以下是我的尝试。它起作用,除非“下一个”数字大于“当前”数字。我真的不确定为什么,但是当我检查if(next>
= num)时,if块甚至没有被执行?

var DIGIT_VALUES = {
  I: 1,
  V: 5,
  X: 10,
  L: 50,
  C: 100,
  D: 500,
  M: 1000
};

var translateRomanNumeral = function(roman) {
  // if it's not in the digit values object, return null
  for (var i = 0; i < roman.length; i++) {

    if (!(roman[i] in DIGIT_VALUES)) {
      return null;
    }

  }
  //with underscore:
 var romanTranslated =  reduce(roman, function(memo, letter, i) {
    var prev = DIGIT_VALUES[roman[i - 1]];
    var num = DIGIT_VALUES[letter];
    var next = DIGIT_VALUES[roman[i + 1]];
    if (next === undefined || next <= num) {
      return memo + num;
    }

由于某些原因,该命令未执行:

    if (next >= num) {
      var diff = num - prev;
      console.log(diff);
      return memo + (diff - prev);
    }
  }, 0);
  // grab the first one

  //1
  // console.log(num);
return romanTranslated;


};

console.log(translateRomanNumeral("LXIV")); //returns 66 ---> should return 64
console.log(translateRomanNumeral("CI")); //working --> returns 101
console.log(translateRomanNumeral("MMMMCCL")); // working ---> returns 4250.
//works!

阅读 485

收藏
2020-07-28

共1个答案

小编典典

错误的主要根源是,我定义的reduce方法不允许我在迭代时访问索引。我更新了我的reduce函数,然后经过一点调试就可以了:

var DIGIT_VALUES = {
  I: 1,
  V: 5,
  X: 10,
  L: 50,
  C: 100,
  D: 500,
  M: 1000
};
var each = function(collection, iterator) {
  if (Array.isArray(collection)) {
    for (var i = 0; i < collection.length; i++) {
      iterator(collection[i], i, collection);
    }

  } else {
    for (var key in collection) {
      iterator(collection[key], key, collection);
    }
  }

};

var reduce = function(collection, iterator, total) {
  if (total == undefined) {
    total = collection.shift();
  }


  each(collection, function(val, i) {
    total = iterator(total, val, i);
  })
  return total;
};

var translateRomanNumeral = function(roman) {
  if (typeof(roman) !== 'string') {
    return null;
  }
  if (!roman) {
    return 0;
  }
  // if it's not in the digit values object, return null
  for (var i = 0; i < roman.length; i++) {

    if (!(roman[i] in DIGIT_VALUES)) {
      return null;
    }

  }
  //with underscore:

  return reduce(roman, function(memo, letter, i) {
    var num = DIGIT_VALUES[letter];
     //console.log(i);
    //how do you acess the next item in a collection in reduce?
    var next = DIGIT_VALUES[roman[Number(i) + 1]];
    // console.log(Number(i) + 1);
    // console.log(next);

      if ( next === undefined || next <= num) {
        return memo + num;
        //console.log(memo);
      }

      else {
        // var diff = num - prev;
        // console.log(diff);
        return memo - num;
        // memo = memo + (next - num);
      }


    // return memo;
  }, 0);

};

console.log(translateRomanNumeral("LXIV")); //returns 66 ---> should return 64
console.log(translateRomanNumeral("IX")) // should return 9
console.log(translateRomanNumeral("IV")) /// should return 4

console.log(translateRomanNumeral("CI")); 
//working --> returns 101
console.log(translateRomanNumeral("MMMMCCL")); 
// working ---> returns 4250.
//works!
2020-07-28