При преобразовании чисел в римские цифры мне нужно, если первое число «2000» больше, чем указано в предоставленном массиве, добавить максимальное значение массива, пока оно не дойдет до 2000.
Я столкнулся с проблемой после того, как закончил выставление цифр для 2000. Она переходит к следующему числу в массиве, которое является НУЛЕМ! [2000,0,80,4]
Мне нужно пропустить, если он равен нулю. Я попытался указать finalnum [i]! = 0.
for (i = 0; i < finalnum.length; i++) {
var idx = romanNum.indexOf(finalnum[i]);
if (idx === -1 && finalnum[i] != 0) {
var max = romanNum.reduce(function(a, b) {
return (Math.max(a, b));
});
var amountoftimes = finalnum[i] / max;
idx = romanNum.indexOf(max);
romans.push(romanEquiv[idx].repeat(amountoftimes));
} //end of if statement
}
}var romanNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000];
var romanEquiv = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M'];
function convertToRoman(num) {
//convert num to separate numbers
var indices = [];
var romans = [];
//split out the number first
var nextint = num.toString().split("");
var nextarr = [];
for (var i = 0; i < nextint.length; i++) {
var firstnum = "0".repeat(nextint.length - i - 1);
nextarr.push(nextint[i] + firstnum);
var finalnum = nextarr.map(Number);
}
//find the romannumerals
for (i = 0; i < finalnum.length; i++) {
var idx = romanNum.indexOf(finalnum[i]);
if (idx === -1 && finalnum[i] != 0) {
var max = romanNum.reduce(function(a, b) {
return (Math.max(a, b));
});
var amountoftimes = finalnum[i] / max;
idx = romanNum.indexOf(max);
romans.push(romanEquiv[idx].repeat(amountoftimes));
} //end of if statement
}
return romans.join('');
}
console.info(convertToRoman(2084));@barmar, извините, я забыл поставить инструкцию console.info, теперь исправлено.
Было бы значительно яснее сделать это оператором return, а затем вызвать console.info(convertToRoman(2084)).



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Проверьте, есть ли finalnum[i] == 0, и перейдите к следующему номеру с помощью continue;.
Однако остальная часть вашего кода, похоже, работает некорректно. Он по-прежнему просто возвращает "MM". В вашем алгоритме есть и другие проблемы, которые
Вы также должны использовать return в функции. Делай console.info() в звонилке.
Кстати, петлю reduce можно заменить на:
var max = Math.max.apply(Math, romanNum);
Я не совсем уверен, зачем вам эта переменная, и вам, конечно, не нужно вычислять ее каждый раз в цикле, поскольку массив romanNum никогда не изменяется. Кажется, это часть вашего запутанного алгоритма. Есть много других вопросов по SO (а также Проверка кода) о преобразовании в римские числа, вы можете посмотреть на них.
var romanNum = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000];
var romanEquiv = ['I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM', 'M'];
function convertToRoman(num) {
//convert num to separate numbers
var indices = [];
var romans = [];
//split out the number first
var nextint = num.toString().split("");
var nextarr = [];
for (var i = 0; i < nextint.length; i++) {
var firstnum = "0".repeat(nextint.length - i - 1);
nextarr.push(nextint[i] + firstnum);
var finalnum = nextarr.map(Number);
}
//find the romannumerals
for (i = 0; i < finalnum.length; i++) {
if (finalnum[i] == 0) { // skip zeroes
continue;
}
var idx = romanNum.indexOf(finalnum[i]);
if (idx === -1 && finalnum[i] != 0) {
var max = romanNum.reduce(function(a, b) {
return (Math.max(a, b));
});
var amountoftimes = finalnum[i] / max;
idx = romanNum.indexOf(max);
romans.push(romanEquiv[idx].repeat(amountoftimes));
} //end of if statement
}
return romans.join('');
}
console.info(convertToRoman(2084));спасибо @Barmar Я отредактировал свой исходный код, но проблема, с которой я столкнулся, заключается в том, что код пропускает "80". он возвращает MMIV, когда должен возвращать MMLXXXIV. Есть предложения, как это исправить?
Я отменил вашу правку, так как мой ответ не имеет смысла, когда вы объединяете его с вопросом.
Кстати, пожалуйста, разместите код с правильным отступом. Вы можете использовать кнопку Tidy в редакторе фрагментов, чтобы убрать отступ.
исправил это сейчас. Все еще не могу понять, как заставить цикл работать должным образом после того, как он решил игнорировать ноль.
Весь ваш дизайн кажется очень запутанным. Зачем разбивать ввод на массив символов, вы должны обращаться с ним как с числом. Найдите максимальный элемент romanNum, который меньше входного, вычислите количество повторений, прибавьте их к результату и вычтите из входного. Затем повторяйте это, пока на входе не будет 0.
convertToRoman()ничего не возвращает.