Если функция суммы используется без аргументов, то возвращать значение суммы всех переданных до этого значений. JS

Рейтинг: 0Ответов: 1Опубликовано: 08.04.2023

Мне нужна помощь, друзья! У меня написана функция суммы, которая принимает числа в качестве аргументов и возвращает их сумму.

const sum = (...arr) => {
    return arr.reduce((a, b) => {
        return a + (+b || 0);
    }, 0);
};


console.log(sum(1, 2, 3, -4, 6, 5)); // 13
console.log(sum()); // 0

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

Ответы

▲ -1Принят

Из вашего вопроса не совсем понятно чего вы хотите, я написал два варианта, но не уверен, что именно вы подразумевали.

Вариант 1

let prevSum = 0;
const sum = (...arr) => {
  if (arr.length === 0) {
    return prevSum;
  }

  const currentSum = arr.reduce((a, b) => {
    return a + (+b || 0);
  }, 0);

  prevSum = currentSum;

  return currentSum;
};


console.log(sum(2, 2)); // 4
console.log(sum(1, 2, 3, -4, 6, 5)); // 13
console.log(sum()); // 13

В этом варианте, если аргументы не были переданы, возвращается последняя сумма которая была возвращена.

Вариант 2

let totalSum = 0;
const sum = (...arr) => {
  if (arr.length === 0) {
    return totalSum;
  }

  const currentSum = arr.reduce((a, b) => {
    return a + (+b || 0);
  }, 0);

  totalSum += currentSum;

  return currentSum;
};


console.log(sum(2, 2)); // 4
console.log(sum(1, 2, 3, -4, 6, 5)); // 13
console.log(sum()); // 17

В этом варианте, если аргументы не были переданы, возвращается общая сумма которая получается в результате сложения переданных до этого чисел.


Но как отметил @SpaceResearcher, функция, которая суммирует, должна только суммировать и не более того, так что не рекомендую вам делать что-то подобное.

Вот более правильный подход (Я использовал замыкание):

const sum = (...arr) => {
  return arr.reduce((a, b) => {
    return a + (+b || 0);
  }, 0);
};

const mySum = createSum();

console.log(mySum(2, 2)); // 4
console.log(mySum(1, 2, 3, -4, 6, 5)); // 13
console.log(mySum()); // 17

function createSum() {
  let total = 0;
  const summ = (...arr) => {
    if (arr.length === 0) {
      return total;
    }

    const currentSum = sum(...arr);

    total += currentSum;

    return currentSum;
  }

  return summ;
}