Как я могу очистить этот код и написать его более красноречиво?

Я работаю над некоторыми практическими задачами с использованием функций высшего порядка, и пока мне удалось решить эту задачу. Я не могу не думать, что этот код уродлив и не самый красноречивый, какой мог бы быть. Есть ли способ объединить карту и уменьшить - более чистый способ, чем я сделал? Кроме того, есть ли какие-либо другие методы или улучшения, которые я мог бы здесь использовать? Я просто хочу стать лучше, и любой отзыв будет оценен.

Проблема: задано число, функция "sumDigits" возвращает сумму всех его цифр. Если число отрицательное, первая цифра должна считаться отрицательной.

function sumDigits(num) {

  //create array of number char
  var string = num.toString().split('');

  //if first char is negative symbol let the first numeric element be negative
  if (string[0] === "-") {
    string[1] = '-' + string[1];
    string.shift();
  }

  //convert string to int
  var toInteger = string.map(function(x) {
    return Number(x);
  });

  //get sum 
  return toInteger.reduce(function(sum, current) {
    sum += current;
    return sum;
  })
}

sumDigits(-316);


person ayeteo    schedule 13.08.2017    source источник
comment
Попробуйте codereview.stackexchange.com. Переполнение стека предназначено для сломанного кода.   -  person Claies    schedule 13.08.2017
comment
другие методы stackoverflow. ком/вопросы/38334652/   -  person wrangler    schedule 13.08.2017


Ответы (1)


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

function sumDigits ( num ) {
    const chars = num.toString( ).split( '' );

    // Subtract first digit if the string starts with a '-'
    // Needs to be subtracted twice, since it is included in the sum
    return ( chars[0] === '-' ? -2*chars[1] : +chars[0] ) +
      chars.slice( 1 ).reduce( (sum, value) => sum + +value, 0 )
    ;
}
person Paul    schedule 13.08.2017