#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;
};