Возвращает сумму числа (положительного или отрицательного)

Мне нужно сделать функцию, которая принимает число и возвращает сумму его цифр, если число отрицательное, первая цифра должна считаться отрицательной при добавлении чисел, вот что у меня есть:

var arrx = [];
var oper;
var others = 0;

function sumDigits(num) {
    // your code here
    var y = num.toString();
    var c = y.split("");
    c.forEach((h) => arrx.push(Number(h)) );
    if (num < 0){
        oper = -arrx[0];
        for (var z = 1; z < arrx.length; z++){
            others += arrx[z];
        }

        return others + oper;
    }

    return arrx.reduce((a,b) => a+b);
}

sumDigits(1234);

Когда задано отрицательное число, функция возвращает NaN, в чем проблема?


person Community    schedule 29.01.2017    source источник
comment
Почему вы помещаете цифры в массив, когда c уже единица?   -  person Code-Apprentice    schedule 30.01.2017
comment
Я предлагаю разработать алгоритм, который работает непосредственно с числами, а не преобразует число в строку. Можете ли вы придумать способ получить цифру единиц из числа? Как получить остальную часть числа, кроме цифры единиц?   -  person Code-Apprentice    schedule 30.01.2017


Ответы (2)


Используйте оптимизированную и короткую версию функции sumDigits():

function sumDigits(num) {
  var isNeg = num < 0,   // check whether the number is negative
      numbers = (isNeg? String(num).slice(1) : String(num)).split('').map(Number);
  if (isNeg) numbers[0] *= -1;   // 'recovering' the number's sign

  return numbers.reduce(function(a,b){ return a + b; });
}

console.log(sumDigits(1234));
console.log(sumDigits(-951));

person RomanPerekhrest    schedule 29.01.2017
comment
у меня проблемы с пониманием значения в цифрах. Если бы я написал это, это выглядело бы так? if(isNeg) { String(num).slice(1); } else { String(num); } numbers.split('').map(Number); ? - person Francis; 12.04.2017
comment
@FrancisNgo, вы забыли присвоить результат условия numbers - person RomanPerekhrest; 12.04.2017
comment
нет, if(isNeg) { numbers = String(num).slice(1); } else { numbers = String(num); } . Но выглядит не лучше оригинала - person RomanPerekhrest; 12.04.2017

В случае отрицательного числа первым символом является '-' символ минус. Когда вы пытаетесь преобразовать его в число, вы получаете NaN. После этого, если вы попытаетесь прибавить NaN к любому числу, результатом будет NaN.

В качестве решения вам нужно игнорировать первую цифру, если число отрицательное.

Таким образом, вы можете внести изменения в код, например

if(z === 1){
    others = others - arrx[z];
    }else{
     others += arrx[z];
      }

а также изменение возврата в случае отрицательных чисел на return others;

Следующий код должен работать.

var arrx = [];
var oper;
var others = 0;

function sumDigits(num) {
 // your code here

var y = num.toString();

var c = y.split("");

c.forEach((h) => arrx.push(Number(h)) );

if (num < 0){


for (var z = 1; z < arrx.length; z++){

  if(z === 1){
    others = others - arrx[z];
    }else{
     others += arrx[z];
      }

}

return others;
}

return arrx.reduce((a,b) => a+b);

}
console.log(sumDigits(-1234));

person Abhinav Galodha    schedule 29.01.2017
comment
Если я проигнорирую это, результат не будет хорошим в случае отрицательного числа. - person ; 30.01.2017
comment
Проверьте код в сообщении, он должен работать, он почти такой же, за исключением условий return и if. - person Abhinav Galodha; 30.01.2017