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

const arrPartSums=[0, 1, 3, 6, 10]
    for (let i of arrPartSums) {
      arrPartSums.shift(1)
      console.log('arr ', sum=arrPartSums)
    }

Добрый день подскажите как возращать не новые массивы а их сумму элементов

Хочу услышать отвер советом или кодом

Я вывожу массивы где выводится изначальный массив только без первого элемента - и так по цыклу


Ответы (2 шт):

Автор решения: xydope

let arg = [1, 3, 4, 5];

const fn = (arr) => arr.reduce((acc, item, index) => 
  [...acc, arr.slice(index, arr.length).reduce((acc, deepItem) => 
    acc + deepItem, 0)], [])

console.log(fn(arg))

→ Ссылка
Автор решения: OPTIMUS PRIME

UPD: Я тут кое-что проверил...

for (let i = 0; i < 10; i++ ) {
  console.log(test1(), test2());
}

function test1() {
  let start = performance.now();
  
  let arr = [];

  for (let i = 0; i < 20000; i++) {
    arr.unshift(i);
  }

  return "unshft: " + (performance.now() - start).toFixed(3);
}

function test2() {
  let start = performance.now();
  
  let arr = [];

  for (let i = 0; i < 20000; i++) {
    arr.push(i);
  }
  arr.reverse();

  return "push + reverse: " + (performance.now() - start).toFixed(3);
}

Оказалось, делать unshift на каждой итерации (который каждый раз должен сдвинуть индексы всех остальных элементов) - примерно в 100 раз дороже, чем push + один раз .reverse() в конце.

let arr = [1, 2, 3, 4, 5];

let result = [], sum = 0;

for (let i = arr.length - 1; i >= 0; i-- ) {
  result.push( sum += arr[i] );
}

console.log( JSON.stringify( result.reverse() ) );


Старый ответ (не подумал, что unshift - тоже неявный цикл):

Если ходить по массиву справа налево, можно обойтись одним проходом, и таскать с собой переменную, храняющую текущую сумму:

let arr = [1, 2, 3, 4, 5];

let result = [], sum = 0;

for (let i = arr.length - 1; i >= 0; i-- ) {
  result.unshift( sum += arr[i] );
}

console.log( JSON.stringify(result) );

→ Ссылка