Как в jquery просуммировать значения массива с одинаковыми датами
Прошу помочь с получением данных из массива.
Есть массив, к примеру:
Дата, значение1, значение2, Значение3, Значение4
2021-10-21, 1, 1, 1, 1
2021-10-21, 1, 1, 1, 1
2021-10-22, 1, 1, 1, 1
2021-10-22, 1, 1, 1, 1
2021-10-23, 1, 1, 1, 1
Я хочу пройтись циклом по этому массиву выбрать все значения с одинаковыми датами и просуммировать их и вывести полученный результат в HTML.
По итогу должно получиться
2021-10-21, 2, 2, 2, 2
2021-10-22, 2, 2, 2, 2
2021-10-23, 1, 1, 1, 1
Сейчас я получаю сумму всех значений из БД кодом:
Массив:
var массив = JSON.parse(data)
//По итогу массив получается если в консоль вывести:
0: ""
1: {id: "1", id2: "1", date: "2021-10-18", значение1: "1", "значение2": "1", "значение3": "1", "значение4": "1"}
2: {id: "2", id2: "1", date: "2021-10-18", значение1: "1", "значение2": "1", "значение3": "1", "значение4": "1"}
3: {id: "3", id2: "1", date: "2021-10-19", значение1: "1", "значение2": "1", "значение3": "1", "значение4": "1"}
$.each(массив, function(index,value) {
for (var i = 0; i < value["active"].length; i++) {
var Дата = value["Дата"];
var Значение1 += value["Значение1"];
var Значение2 += value["Значение2"];
var Значение3 += value["Значение3"];
var Значение4 += value["Значение3"];
}
$(".text").append(
'<td>'+Дата+'</td>'+
'<td>'+Значение1+'</td>'+
'<td>'+Значение2+'</td>'+
'<td>'+Значение3+'</td>'+
'<td>'+Значение4+'</td>'
);
}
Но это выводит каждую дату отдельно и не правильно суммирует значения у строк.
Ответы (2 шт):
const arr = [
{id: "1", id2: "1", date: "2021-10-18", value1: "1", value2: "1", value3: "1", value4: "1"},
{id: "2", id2: "1", date: "2021-10-18", value1: "1", value2: "1", value3: "1", value4: "1"},
{id: "3", id2: "1", date: "2021-10-19", value1: "1", value2: "1", value3: "1", value4: "1"},
];
const map = {};
arr.forEach(({date, value1, value2, value3, value4, ...other}) => {
if (map.hasOwnProperty(date)) {
map[date].value1 += +value1;
map[date].value2 += +value2;
map[date].value3 += +value3;
map[date].value4 += +value4;
} else map[date] = Object.assign({value1: +value1, value2: +value2, value3: +value3, value4: +value4}, other);
});
console.log(map);
Для подсчета по ключу удобно использовать ассоциативные массивы (во всех языках программирования). Добавил в ваш код промежуточную переменную ht, используемую для подсчета суммы для каждой даты.
var data = `{
"0": "",
"1": {"id": "1", "id2": "1", "date": "2021-10-18", "значение1": "1", "значение2": "1", "значение3": "1", "значение4": "1"},
"2": {"id": "2", "id2": "1", "date": "2021-10-18", "значение1": "1", "значение2": "1", "значение3": "1", "значение4": "1"},
"3": {"id": "3", "id2": "1", "date": "2021-10-19", "значение1": "1", "значение2": "1", "значение3": "1", "значение4": "1"}
}`;
var массив = JSON.parse(data);
var ht = {};
$.each(массив, function(index,value) {
var Дата = value["date"];
if (!Дата)
return;
var Значение1 = parseInt(value["значение1"], 10);
var Значение2 = parseInt(value["значение2"], 10);
var Значение3 = parseInt(value["значение3"], 10);
var Значение4 = parseInt(value["значение4"], 10);
//for (var i = 0; i < value["active"].length; i++) {
if (ht[Дата]) {
ht[Дата]["Значение1"] += Значение1;
ht[Дата]["Значение2"] += Значение2;
ht[Дата]["Значение3"] += Значение3;
ht[Дата]["Значение4"] += Значение4;
}
else {
ht[Дата] = {
"Значение1": Значение1,
"Значение2": Значение2,
"Значение3": Значение3,
"Значение4": Значение4,
}
}
});
for (var i in ht) {
$(".text").append('<tr>' +
'<td>'+i+'</td>'+
'<td>'+ht[i]["Значение1"]+'</td>'+
'<td>'+ht[i]["Значение2"]+'</td>'+
'<td>'+ht[i]["Значение3"]+'</td>'+
'<td>'+ht[i]["Значение4"]+'</td>'+
'</tr>');
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table class="text"></table>