使用JavaScript的罗马数字翻译器
我在不使用下划线的情况下就可以使用它,但是作为一个额外的挑战,我试图使用下划线将罗马数字转换为阿拉伯数字。以下是我的尝试。它起作用,除非“下一个”数字大于“当前”数字。我真的不确定为什么,但是当我检查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!
回答:
错误的主要根源是,我定义的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!
以上是 使用JavaScript的罗马数字翻译器 的全部内容, 来源链接: utcz.com/qa/407022.html