Страницы

Поиск по вопросам

понедельник, 4 марта 2019 г.

Как сложить два массива в массиве объектов

Есть массив в котором находятся объекты с массивом данных.
Нужно получить сумму всех элементов массива объектов и добавить каждую сумму в объект, затем нужно получить сумму двух объектов и так же добавить в объект.
Так же нужно сложить элементы из массива первого объекта с элементами из массива второго эл и добавить в массив с суммой каждого свойства т.е объект а) [1,2,3] и объект б) [4,5,6] сложить их и получить на выходе [ 5,7,9]
Смог получить сумму двух элементов массива но вариант оказался весьма деревянным, т.к привязан к свойству первого объекта
function chartSumm(arr) { let obj, firstArr = [], lastArr = [], sumArray = [] arr.forEach(function(item, index) { for (let el in item.data) { if (item.label === 'Эккономия на аннуляции') { firstArr = item.data; } else { lastArr = item.data } } }); let firstObjSum = firstArr.reduce(function(prev, curr, index) { return prev + curr }); let twoObjSum = lastArr.reduce(function(prev, curr, index) { return prev + curr }); obj = { 'Цена у стойки': firstObjSum, 'Аннуляция без штрафа': twoObjSum, 'Общая экономия': firstObjSum + twoObjSum }; console.log(obj) } chartSumm([{ label: 'Эккономия на аннуляции', backgroundColor: '#ef9d4d', data: [1000, 400, 1500, 1500, 3000, 4000] }, { label: 'Экономия на цене у стойки', backgroundColor: '#476e8f', data: [1170, 460, 2000, 2500, 2700, 4000] }, ])


Ответ

Так как лейблы разные, то их в любом случае придется прописывать. Чтобы сделать функцию более универсальной ( и не для только лишь 2 обхектов) можно вынести лейбл результата в объект. Я так же вынес лейбл Общая Экономия отдельно из функцию, но можно задавать его и внутри.
function chartSumm(arr, sumLabel, elementSumLabel) { var result = {}; result[sumLabel] = 0; result[elementSumLabel] = [0, 0, 0, 0, 0, 0] arr.forEach(function(item, index) { result[item.resultLabel] = 0; for (var i = 0; i < item.data.length; i++) { result[elementSumLabel][i] += item.data[i]; result[item.resultLabel] += item.data[i] } result[sumLabel] += result[item.resultLabel]; }); return result; } var info = chartSumm([{ label: 'Эккономия на аннуляции', resultLabel: 'Цена у стойки', backgroundColor: '#ef9d4d', data: [1000, 400, 1500, 1500, 3000, 4000] }, { label: 'Экономия на цене у стойки', resultLabel: 'Аннуляция без штрафа', backgroundColor: '#476e8f', data: [1170, 460, 2000, 2500, 2700, 4000] }, ], 'Общая экономия', 'Сумма элементов'); console.log(info);

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

Отправить комментарий