У меня есть компонент React, который извлекает данные JSON из вызова get, и мне нужно его переформатировать (я все еще новичок, когда дело доходит до манипуляций с массивами). Вот исходный возвращенный JSON:
{
"metrics": {
"2018-12-26 18:00:00": {
"20": 451,
"30": 48
},
"2018-12-26 19:00:00": {
"20": 165
},
"2018-12-27 00:00:00": {
"20": 177,
"30": 8
},
"2018-12-27 01:00:00": {
"20": 220
},
"2018-12-27 02:00:00": {
"20": 220
},
"2018-12-27 03:00:00": {
"20": 177,
"30": 8
},
"2018-12-27 04:00:00": {
"20": 220
},
"2018-12-28 00:00:00": {
"20": 93
},
"2018-12-28 01:00:00": {
"20": 76
},
"2018-12-28 02:00:00": {
"20": 76
},
"2018-12-28 03:00:00": {
"20": 57
},
"2018-12-28 04:00:00": {
"20": 76
},
"2018-12-28 15:00:00": {
"20": 130,
"30": 10
}
}
}
Что мне нужно, так это разделить это на отдельные даты и сложить числа «20» и «30» вместе, чтобы я получил что-то вроде этого для каждой даты:
"2018-12-26": {
"20": total number here,
"30": total number here
}
Я знаю, что это будет связано с Object.keys и, возможно, разрушением, но я быстро никуда не денусь. Любая помощь будет принята с благодарностью.
Да, как говорит @Toby, опубликуйте соответствующий код реакции
Ладно сделаю спасибо.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сделать это так
Итак, идея состоит в том, чтобы сначала создать empty object для хранения нашего final output. Теперь мы переберем все ключи данного объекта и проверим, есть ли этот ключ уже в output object или нет, если это их, мы добавляем соответствующий key's value к объекту вывода, если нет, то создаем новое свойство в output object.
let data = { "metrics": { "2018-12-26 18:00:00": {"20": 451, "30": 48 },"2018-12-26 19:00:00": { "20": 165 }, "2018-12-27 00:00:00": { "20": 177, "30": 8 }, "2018-12-27 01:00:00": { "20": 220 }, "2018-12-27 02:00:00": { "20": 220 }, "2018-12-27 03:00:00": { "20": 177, "30": 8 }, "2018-12-27 04:00:00": { "20": 220 }, "2018-12-28 00:00:00": { "20": 93 }, "2018-12-28 01:00:00": { "20": 76 },"2018-12-28 02:00:00": { "20": 76 }, "2018-12-28 03:00:00": { "20": 57 }, "2018-12-28 04:00:00": { "20": 76 }, "2018-12-28 15:00:00": { "20": 130, "30": 10 }}}
let op = {}
for(let key in data['metrics']){
let temp= new Date(key);
let fullDate = temp.getFullYear()+'-'+temp.getMonth()+'-'+temp.getDate();
if (op[fullDate]){
for(let val in data['metrics'][key])
{
if (op[fullDate][val])
op[fullDate][val] += data['metrics'][key][val]
else op[fullDate][val] = data['metrics'][key][val]
}
} else {
op[fullDate] = {...data['metrics'][key]};
}
}
console.info(op);О, МОЙ БОГ, ты принц среди людей! Спасибо, я отправлю это как ответ. Прекрасно работает. Спасибо Спасибо спасибо!
@ CHays412 всегда рад помочь :)
Итерируйте даты записи с помощью Array.reduce(), получите дату, разделив строку, и добавьте объект, если он не существует. Итерируйте записи значений с помощью for...of, добавьте значения в объект даты:
const data = {"metrics":{"2018-12-26 18:00:00":{"20":451,"30":48},"2018-12-26 19:00:00":{"20":165},"2018-12-27 00:00:00":{"20":177,"30":8},"2018-12-27 01:00:00":{"20":220},"2018-12-27 02:00:00":{"20":220},"2018-12-27 03:00:00":{"20":177,"30":8},"2018-12-27 04:00:00":{"20":220},"2018-12-28 00:00:00":{"20":93},"2018-12-28 01:00:00":{"20":76},"2018-12-28 02:00:00":{"20":76},"2018-12-28 03:00:00":{"20":57},"2018-12-28 04:00:00":{"20":76},"2018-12-28 15:00:00":{"20":130,"30":10}}};
const result = Object.entries(data.metrics)
.reduce((r, [date, values]) => {
const [d] = date.split(/\s+/);
const current = r[d] ? r[d] : (r[d] = {});
for(const [k, v] of Object.entries(values)) {
current[k] = (current[k] || 0) + v;
}
return r;
}, {});
console.info(result);
Я считаю, что вы правы, Object.keys будет задействован. Но вам нужно будет опубликовать, какой у вас код, показывая, что вы пробовали, и где код терпит неудачу.