Встроить математические функции в калькулятор Java Script
Делаю тестовое задание, нужно написать калькулятор на римских и арабских (вычитание, сложение, деление, умножение)
Сможет кто-то дать наводку что писать и где искать или сам напишет если кому не сложно?

function calculator(string) {
const useStrict = {
z: 2000,
m: 2000,
cm: 900,
d: 500,
cd: 400,
c: 100,
xc: 90,
l: 50,
xl: 40,
x: 10,
ix: 9,
v: 5,
IV: 4,
i: 1
};
function rom2arab(string) {
return string.toUpperCase().split('').reduce(function (s, v, i, arr) {
const [a, b] = [
useStrict[arr[i]],
useStrict[arr[i + 1]],
useStrict[arr[i + 2]],
];
return b > a ? s - a : s + a;
}, 0);
}
function arab2rome(num) {
if (num < 1) return ' ';
let result = ' ';
for (var key in useStrict)
while (num >= useStrict[key]) {
result += key;
num -= useStrict[key];
}
return result;
}
let letter = [];
string = string.replace(/[^IVXLCDMZ\d+\-*\/]/gi, ch => {
if (ch !== ' ') letter.push(ch);
return ' ';
});
if (letter.length > 0)
throw Error('Символы не допустимы, Вы ввели это: ' + letter);
let vars = string.split(/[+\-*\/]/g);
if (vars.length !== 2)
throw Error('Должно быть 2 операнда');
const isRome = /^[IVXLCDMZ]+$/i;
const r = vars.reduce((s, v) => s + isRome.test(v), 0);
if (r === 1)
throw Error('Оба числа должны быть записаны арабскими или римскими цифрами');
else if (r === 2)
vars = vars.map (v => rom2arab(v));
if (vars.some(v => v < 1 || v > 10))
throw Error('Допустимое значение оператора от 1 до 10 включительно');
let acr = string.match(/[+\-*\/]/)[0];
let result = Math.floor((vars.join(acr)));
return r === 0 ? result.toString() : arab2rome(result);
}
//пишем код здесь
module.exports = calculator; // Не трогайте эту строчку
Вам нужно определить операции сложения, вычитания, умножения и деления. Вы можете сделать это, создав отдельные функции для каждой операции, а затем вызывая эти функции на основе оператора, обнаруженного во входной строке.
Вот как вы можете определить эти функции:
function add(a, b) {
return a + b;
}
function subtract(a, b) {
return a - b;
}
function multiply(a, b) {
return a * b;
}
function divide(a, b) {
if (b === 0) {
throw Error('Division by zero is not allowed');
}
return a / b;
}
Затем вам нужно изменить вашу функцию calculator, чтобы вызывать эти операции в зависимости от оператора, обнаруженного во входной строке. Вы можете сделать это, создав внутри вашей функции calculator оператор switch:
let result;
switch (acr) {
case '+':
result = add(vars[0], vars[1]);
break;
case '-':
result = subtract(vars[0], vars[1]);
break;
case '*':
result = multiply(vars[0], vars[1]);
break;
case '/':
result = divide(vars[0], vars[1]);
break;
default:
throw Error('Invalid operator');
}
Этот оператор switch вызовет соответствующую функцию в зависимости от оператора и сохранит результат в переменной result. В случае default будет выдана ошибка, если обнаружен недопустимый оператор.
Наконец, вам нужно вернуть результат в нужном формате (арабском или римском) в зависимости от ввода:
return r === 0 ? result.toString() : arab2rome(result);
Эта строка преобразует результат в строку, если ввод был выполнен в арабских числах, или преобразует его в римские числа, если ввод был выполнен в римских числах.
У тебя перебор с функциями, так что мне искать место ошибки лень
А ошибка явно в типе данных, т.к. выдаёт NaN