Мы хотим сделать этот проект с открытым исходным кодом доступным для людей во всем мире. Пожалуйста, помогите нам перевести это руководство на другие языки.
КупитьEPUB/PDF
Поделиться
вернуться к уроку

Массив частичных сумм

важность: 2

На входе массив чисел, например: arr = [1,2,3,4,5].

Напишите функцию getSums(arr), которая возвращает массив его частичных сумм.

Иначе говоря, вызов getSums(arr) должен возвращать новый массив из такого же числа элементов, в котором на каждой позиции должна быть сумма элементов arr до этой позиции включительно.

То есть:

для arr = [ 1, 2, 3, 4, 5 ]
getSums( arr ) = [ 1, 1+2, 1+2+3, 1+2+3+4, 1+2+3+4+5 ] = [ 1, 3, 6, 10, 15 ]

Ещё пример: getSums([-2,-1,0,1]) = [-2,-3,-3,-2].

  • Функция не должна модифицировать входной массив.
  • В решении используйте метод arr.reduce.

Открыть песочницу с тестами для задачи.

Метод arr.reduce подходит здесь идеально. Достаточно пройтись по массиву слева-направо, накапливая текущую сумму в переменной и, кроме того, добавляя её в результирующий массив.

Неправильный вариант может выглядеть так:

function getSums(arr) {
 var result = [];
 if (!arr.length) return result;
 arr.reduce(function(sum, item) {
 result.push(sum);
 return sum + item;
 });
 return result;
}
alert(getSums([1,2,3,4,5])); // результат: 1,3,6,10

Перед тем, как читать дальше, посмотрите на него внимательно. Заметили, в чём ошибка?

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

Это из-за того, что последняя сумма является результатом метода reduce, он на ней заканчивает проход и далее функцию не вызывает, поэтому она оказывается не добавленной в result.

Исправим это:

function getSums(arr) {
 var result = [];
 if (!arr.length) return result;
 var totalSum = arr.reduce(function(sum, item) {
 result.push(sum);
 return sum + item;
 });
 result.push(totalSum);
 return result;
}
alert(getSums([1,2,3,4,5])); // 1,3,6,10,15
alert(getSums([-2,-1,0,1])); // -2,-3,-3,-2
function getSums(arr) {
 var result = [];
 if (!arr.length) return result;
 var totalSum = arr.reduce(function(sum, item) {
 result.push(sum);
 return sum + item;
 });
 result.push(totalSum);
 return result;
}

Открыть решение с тестами в песочнице.

AltStyle によって変換されたページ (->オリジナル) /