Как я могу пропустить, если число === 0?

При преобразовании чисел в римские цифры мне нужно, если первое число «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));
convertToRoman() ничего не возвращает.
Barmar 12.04.2018 21:21

@barmar, извините, я забыл поставить инструкцию console.info, теперь исправлено.

user2763557 12.04.2018 21:23

Было бы значительно яснее сделать это оператором return, а затем вызвать console.info(convertToRoman(2084)).

Scott Sauyet 12.04.2018 21:33
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
58
1

Ответы 1

Проверьте, есть ли 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. Есть предложения, как это исправить?

user2763557 12.04.2018 21:48

Я отменил вашу правку, так как мой ответ не имеет смысла, когда вы объединяете его с вопросом.

Barmar 12.04.2018 21:49

Кстати, пожалуйста, разместите код с правильным отступом. Вы можете использовать кнопку Tidy в редакторе фрагментов, чтобы убрать отступ.

Barmar 12.04.2018 21:50

исправил это сейчас. Все еще не могу понять, как заставить цикл работать должным образом после того, как он решил игнорировать ноль.

user2763557 12.04.2018 21:53

Весь ваш дизайн кажется очень запутанным. Зачем разбивать ввод на массив символов, вы должны обращаться с ним как с числом. Найдите максимальный элемент romanNum, который меньше входного, вычислите количество повторений, прибавьте их к результату и вычтите из входного. Затем повторяйте это, пока на входе не будет 0.

Barmar 12.04.2018 23:02

Другие вопросы по теме