#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()