javascript: из массива значений сформировать массив с накопленными значениями
есть массив содержащий данные в виде [year, count]
надо получить массив содержащий уже накопленные за все предыдущие годы значения, но в том же виде - [year, count]
пример данных:
input: [[2010, 10], [2015, 2], [2022, 8]]
output: [[2010, 10], [2015, 12], [2022, 20]]
сделал в лоб:
// подготовить данные
let data_accum: [number, number][] = [];
let count:number = 0;
data.forEach((value: [number, number]) => {
count += value[1];
data_accum.push([value[0], count]);
});
Такой вопрос - а как это сделать покрасивше, что называется "в одну строчку"?
P.S.
другой вариант:
let data_accum = [];
data.reduce((total, value) => {
data_accum.push([value[0], total + value[1]]);
return total + value[1];
}, 0)
избавляется от инициализации счетчика
Ответы (1 шт):
Автор решения: Zhihar
→ Ссылка
data_accum = data.map((value, i, arr) => [value[0], value[1] + arr.slice(0, i).reduce((total, elem) => total + elem[1], 0)])
Нашел решение, но оно все таки очень неоптимальное, хотя для коротких массивов имеет право на жизнь :(
другой подход, лишенный предыдущих недостатков и немного короче:
data_accum = data.reduce((total, value) => [...total, [value[0], value[1] + (total.length ? total[total.length - 1][1] : 0)]], [])
или так:
data_accum = data.reduce((total, value) => [...total, [value[0], value[1] + total[total.length - 1][1]]], [[0, 0]]).slice(1)