Возведение в квадрат каждой цифры числа по отдельности в javascript

#javascript

#javascript

Вопрос:

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

 function squareDigits(num) {
  if (num >= 10) {
    let digits = num.toString().split('');
    let realDigits = digits.map(Number);
    realDigits.forEach(number => {
      return number * number
    });
    return realDigits;
  } else {
    return num * num
  }
}  

Комментарии:

1. Просто хочу отметить, что вы можете приукрасить свой код, то, как вы его написали, трудно прочитать.

2. let squared = digits.map(Number).map(x => x * x)

3. @Alnitak: map(Number) можно смело опустить.

4. @georg это возможно, но OP использовал это, и, по моему опыту, лучший способ избежать моментов «ВАТ?!» — это при первой возможности явно привести ваши переменные к ожидаемому времени. Я не возражаю против использования явных унарных операторов для выполнения этого преобразования, но я подвожу черту под использованием неявного принуждения с помощью двоичного оператора.

5. @GTS подумайте о том, чтобы не использовать специальный регистр для < 10 кода — это не только создает повторение в коде, но и заставляет функцию возвращать только одно число для этого регистра вместо массива.

Ответ №1:

Ваша основная проблема заключается в том, что вы не сохраняете обратно в массив квадрат чисел внутри forEach() метода. Для этого достаточно одной простой модификации вашего кода:

 function squareDigits(num)
{
    if (num >= 10)
    {
        let digits = num.toString().split('');
        let realDigits = digits.map(Number);
        realDigits.forEach((number, idx) => realDigits[idx] = number * number);          
        return realDigits;
    }
    else
    {
        return num * num;
    }
}

console.log(squareDigits(3));
console.log(squareDigits(33));  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

Однако вы можете сделать то же самое, используя уникальное map() (принуждение к числам вступит в силу при использовании оператора умножения):

 function squareDigits(num)
{
    if (num >= 10)
    {
        let digits = num.toString().split('');
        return digits.map(n => n * n);
    }
    else
    {
        return num * num;
    }
}

console.log(squareDigits(3));
console.log(squareDigits(33));  
 .as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}  

Комментарии:

1. аккуратно, никогда раньше не рассматривал возможность возиться со стилем вывода

Ответ №2:

Проблема здесь в том, что возврат из forEach не изменяет исходный массив. Попробуйте использовать .map с новой выходной переменной, подобной этой:

 function squareDigits(num) {
  if (num >= 10) {
    let digits = num.toString().split('');
    let realDigits = digits.map(Number);
    let squaredDigits = realDigits.map(number => {
      return number * number
    });
    return squaredDigits;
  } else {
    return num * num
  }
}  

Ответ №3:

 squareDigits = num => {
  if (num >= 10) {
    return num.toString().split('').map(n => {
      n = Number(n) || 0;
      return n * n;
    });
  } else {
    return num * num
  }
}

console.log(squareDigits(3));
console.log(squareDigits(12123));  

Комментарии:

1. Math.pow() для простого возведения целого числа в квадрат?!

2. @Alnitak Я обновил свой код, чтобы не использовать Math.pow()