javascript - 每个数组的 Javascript 回显,同时还从字符串转换为整数
问题描述
我有一个包含两个值的数组,我的目标是获取罗马数字,将它们转换为整数,然后使用 for each 一个一个地输出它们。我的问题是在我的罗马数字函数转换器中,我收到错误Uncaught TypeError: str1.charAt is not a function on line 16
代码var num = char_to_int(str1.charAt(0));
var dynastyReign = [
{"One Dynasty": "MXLI"},
{"Two Dynasty": "MCCCIIII"},
{"Three Dynasty": "MCCCXCVIII"},
{"Four Dynasty": "MCDXLV"},
{"Five Dynasty": "MDCLXIV"},
{"Six Dynasty": "MCMXLIX"},
{"Seven Dynasty": "MMMXICX"}
];
function roman_to_Int(str1) {
if(str1 == null) return -1;
var num = char_to_int(str1.charAt(0));
var pre, curr;
for(var i = 1; i < str1.length; i++){
curr = char_to_int(str1.charAt(i));
pre = char_to_int(str1.charAt(i-1));
if(curr <= pre){
num += curr;
} else {
num = num - pre*2 + curr;
}
}
return num;
}
function char_to_int(c){
switch (c){
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return -1;
}
}
var year = dynastyReign.map(d => Object.values(d)[0]);
dynastyReign.forEach(function(year) {
document.write(roman_to_Int(year));
});
我如何编写代码首先是创建一个从罗马数字到 int 的转换器函数,声明一个变量以仅获取数组的罗马数字部分(var year),然后使用 for each 与转换器一起输出整数roman_to_Int(year)
。我不确定我应该修复哪个部分,任何帮助将不胜感激。
解决方案
你构造了一个罗马年的数组
var year = dynastyReign.map(d => Object.values(d)[0]);
但是然后你继续迭代dynastyReign
数组,它是一个对象数组,所以
var romanYears = dynastyReign.map(d => Object.values(d)[0]);
romanYears.forEach(function(year) {
document.write(roman_to_Int(year));
});
throws 因为roman_to_Int
接受一个字符串,而不是一个对象。
而是迭代罗马年(并在输出之间添加换行符以使内容可读):
romanYears.forEach(function(year) {
document.write(roman_to_Int(year) + '<br>');
});
var dynastyReign = [{
"One Dynasty": "MXLI"
},
{
"Two Dynasty": "MCCCIIII"
},
{
"Three Dynasty": "MCCCXCVIII"
},
{
"Four Dynasty": "MCDXLV"
},
{
"Five Dynasty": "MDCLXIV"
},
{
"Six Dynasty": "MCMXLIX"
},
{
"Seven Dynasty": "MMMXICX"
}
];
function roman_to_Int(str1) {
if (str1 == null) return -1;
var num = char_to_int(str1.charAt(0));
var pre, curr;
for (var i = 1; i < str1.length; i++) {
curr = char_to_int(str1.charAt(i));
pre = char_to_int(str1.charAt(i - 1));
if (curr <= pre) {
num += curr;
} else {
num = num - pre * 2 + curr;
}
}
return num;
}
function char_to_int(c) {
switch (c) {
case 'I':
return 1;
case 'V':
return 5;
case 'X':
return 10;
case 'L':
return 50;
case 'C':
return 100;
case 'D':
return 500;
case 'M':
return 1000;
default:
return -1;
}
}
var romanYears = dynastyReign.map(d => Object.values(d)[0]);
romanYears.forEach(function(year) {
document.write(roman_to_Int(year) + '<br>');
});
还可以大量清理代码,包括避免document.write
(现在没有任何好的理由使用它)和使用对象而不是switch
:
var dynastyReign=[{"One Dynasty":"MXLI"},{"Two Dynasty":"MCCCIIII"},{"Three Dynasty":"MCCCXCVIII"},{"Four Dynasty":"MCDXLV"},{"Five Dynasty":"MDCLXIV"},{"Six Dynasty":"MCMXLIX"},{"Seven Dynasty":"MMMXICX"}];
const romanCharacterMap = {
I: 1,
V: 5,
X: 10,
L: 50,
C: 100,
D: 500,
M: 1000
};
function romanToInt(str1) {
let num = char_to_int(str1[0]);
for (var i = 1; i < str1.length; i++) {
const curr = char_to_int(str1[i]);
const pre = char_to_int(str1[i - 1]);
if (curr <= pre) {
num += curr;
} else {
num = num - pre * 2 + curr;
}
}
return num;
}
const char_to_int = c => romanCharacterMap[c];
var romanYears = dynastyReign.map(d => Object.values(d)[0]);
romanYears.forEach(function(year) {
document.body.appendChild(document.createElement('div')).textContent = romanToInt(year);
});