如何解决使用JavaScript的罗马数字翻译器
错误的主要根源是,我定义的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!
解决方法
我在不使用下划线的情况下就可以使用它,但是作为一个额外的挑战,我试图使用下划线将罗马数字转换为阿拉伯数字。以下是我的尝试。它起作用,除非“下一个”数字大于“当前”数字。我真的不确定为什么,但是当我检查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!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。