Массив совокупной суммы в Javascript, один работает, а другой нет

#javascript #arrays #cumulative-sum

Вопрос:

Я новичок и пробую несколько ката на codewars. Интересно, может ли кто-нибудь помочь мне и объяснить, что происходит с этим кодом. На данный момент я не ищу решение для всего упражнения, я просто хотел бы понять, почему const cumulativeSum работает по-разному для двух разных массивов.

Я создаю два накопительных массива, код работает для первого (совокупный доход с начальным массивом peopleInLine), и все получается правильно, но когда я использую его для второго (совокупные расходы с требуемым изменением начального массива), цифры неверны.

Мой массив peopleInLine — это: [100, 25, 50, 100, 25, 25, 25, 100, 25, 50, 25, 100, 25, 25, 50, 100, 25, 25, 50, 100]

Я должен признать, что я действительно не понимаю, как работает const cumulativeSum = (сумма => значение =>> сумма = значение)(0)>>. Я нашел его после поиска в переполнении стека!

Очень благодарен за любую помощь.

 function tickets(peopleInLine) {
  let changeRequired = [];

  const cumulativeSum = (sum => value => sum  = value)(0);

  let cumulativeProfit = peopleInLine.map(cumulativeSum);
  cumulativeProfit.splice(0, 0, 0);
  cumulativeProfit.pop();
  //return cumulativeProfit;
  //logs to console [0, 100, 125, 175, 275, 300, 325, 350, 450, 475, 525, 550, 650, 675, 700, 750, 850, 875, 900, 950]

  for (let i = 0; i < peopleInLine.length; i  ) {
      if (peopleInLine[i] === 25) { changeRequired.push(0) }
      else if (peopleInLine[i] === 50) { changeRequired.push(25) }
      else if (peopleInLine[i] === 100) { changeRequired.push(75) }
  };
  //return changeRequired; 
  //correctly logs to console: [75, 0, 25, 75, 0, 0, 0, 75, 0, 25, 0, 75, 0, 0, 25, 75, 0, 0, 25, 75]

  let cumulativeOutgoings = changeRequired.map(cumulativeSum);
  cumulativeOutgoings.splice(0, 0, 0);
  cumulativeOutgoings.pop();
  return cumulativeOutgoings;
  //incorrectly logs to console: [0, 1125, 1125, 1150, 1225, 1225, 1225, 1225, 1300, 1300, 1325, 1325, 1400, 1400, 1400, 1425, 1500, 1500, 1500, 1525] 
  //should be [0, 75, 75, 100, 175,175 etc.]
};
console.log(tickets([100, 25, 50, 100, 25, 25, 25, 100, 25, 50, 25, 100, 25, 25, 50, 100, 25, 25, 50, 100])); 

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

1. Мы можем видеть, в чем заключается неправильный результат, но каков ожидаемый результат? Кроме того, что должен делать этот код?

2. Да, извините, это в конце этой строки, если вы прокрутите ее. Это должно быть кумулятивное добавление параметра changerequired, начинающегося с дополнительного 0 в начале, так что [0, 75, 75, 100, 175, 175, 175, 175, 250, 250, 275, 275, 350, 350, 350, 375, 450, 450, 450, 475]

Ответ №1:

Проблема заключается в том, как вы используете cumulativeSum Вы пытаетесь использовать ссылку на функцию и используете ее между двумя массивами, поэтому, когда вы вызываете второй массив sum , в нем уже есть какое-то значение. Исправление будет выглядеть следующим образом

 function tickets(peopleInLine) {
  let changeRequired = [];

  const cumulativeSum = (sum => value => sum  = value);

  let cumulativeProfit = peopleInLine.map(cumulativeSum(0));
  cumulativeProfit.splice(0, 0, 0);
  cumulativeProfit.pop();


  for (let i = 0; i < peopleInLine.length; i  ) {
      if (peopleInLine[i] === 25) { changeRequired.push(0) }
      else if (peopleInLine[i] === 50) { changeRequired.push(25) }
      else if (peopleInLine[i] === 100) { changeRequired.push(75) }
  };


  let cumulativeOutgoings = changeRequired.map(cumulativeSum(0));
  cumulativeOutgoings.splice(0, 0, 0);
  cumulativeOutgoings.pop();
  return cumulativeOutgoings;
};