Проблема постоянных ошибок в Code Wars с оператором if, не выполняющим цикл for - PullRequest
0 голосов
/ 07 ноября 2019

https://www.codewars.com/kata/persistent-bugger/train/javascript Я работаю над проблемой постоянных ошибок в JavaScript Code Wars. Как видно из кода, мой оператор if, кажется, полностью игнорирует цикл for внутри него.

Все, что записано в цикле for, не отображается, а все, что записано вне цикла for, остается таким же, какесли цикл не был там. Я пытался исследовать использование циклов for внутри операторов if, а также существующие решения этой проблемы Code Wars, но не видел, чтобы моя проблема была воспроизведена. Насколько я понимаю, оператор if должен проходить через все сверху донизу.

const persistence = (num) => {
    if (typeof(num) === 'number') {
        let count = 0
        let mult = num
        let newMult = 1
        let stop = false
        while (stop === false){
            if (mult >= 10) {
                for (let i = 0; i < mult.length; i++) {
                    newMult = newMult * mult[i]
                    // // doesn't log anything. code isn't running through for loop?
                    // console.log(newMult)        
                }
                // // logs initial num of 999
                // console.log(mult)
                // // logs initial newMult of 1
                // console.log(newMult)
                count++
                mult = newMult
                newMult = 1
            }
            else {
                stop = true
            }
        }
        return count
    }
}
// logs 1, should be 4
console.log(persistence(999))

Я думаю, что у меня правильная логика, но, возможно, есть какая-то фундаментальная проблема, которую я упускаю в отношении того, какработают операторы if и for-loop. Я заметил, что есть гораздо более простые способы решения этой проблемы, но если бы я мог получать отзывы о том, почему мой конкретный код не работает, и как я мог настроить его, чтобы он работал, это было бы очень признательно.

Ответы [ 2 ]

0 голосов
/ 07 ноября 2019

Вам нужно перебрать строку версию mult (назовем это multStr), чтобы получить доступ к его индексированным по цифровым параметрам свойствам в виде цифр. (В противном случае он не будет иметь length, и доступ к его числовым свойствам ничего не даст взамен.)

Вы также можете значительно очистить код, вернувшись раньше, вместо того, чтобы иметь такие вложенные блоки. :

const persistence = (num) => {
  if (typeof num !== 'number') {
    return;
  }
  let count = 0
  let mult = num
  while (true) {
    if (mult < 10) {
      return count;
    }
    const multStr = String(mult); // <--------------------------
    let newMult = 1
    for (let i = 0; i < multStr.length; i++) { // <--------------------------
      newMult = newMult * multStr[i] // <--------------------------
    }
    mult = newMult;
    count++
  }
}
console.log(persistence(999))

Можно также использовать reduce для вычисления newMult вместо:

const persistence = (num) => {
  if (typeof num !== 'number') {
    return;
  }
  let count = 0
  let mult = num
  while (true) {
    if (mult < 10) {
      return count;
    }
    mult = [...String(mult)].reduce((a, b) => a * b, 1);
    count++
  }
}
console.log(persistence(999))
0 голосов
/ 07 ноября 2019

Вы выполняете итерацию с длиной num в цикле for. Поскольку num - это номер типа, он не имеет длины.

...