Есть массив в котором находятся объекты с массивом данных.
Нужно получить сумму всех элементов массива объектов и добавить каждую сумму в объект, затем нужно получить сумму двух объектов и так же добавить в объект.
Так же нужно сложить элементы из массива первого объекта с элементами из массива второго эл и добавить в массив с суммой каждого свойства т.е объект а) [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);
Комментариев нет:
Отправить комментарий