首页 > 解决方案 > 每个数组的 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)。我不确定我应该修复哪个部分,任何帮助将不胜感激。

标签: javascript

解决方案


你构造了一个罗马年的数组

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);
});


推荐阅读