我在不使用下划线的情况下就可以使用它,但是作为一个额外的挑战,我试图使用下划线将罗马数字转换为阿拉伯数字。以下是我的尝试。它起作用,除非“下一个”数字大于“当前”数字。我真的不确定为什么,但是当我检查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!