React JS, как мне преобразовать этот массив объектов с датами и числами?

У меня есть компонент 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 и, возможно, разрушением, но я быстро никуда не денусь. Любая помощь будет принята с благодарностью.

Я считаю, что вы правы, Object.keys будет задействован. Но вам нужно будет опубликовать, какой у вас код, показывая, что вы пробовали, и где код терпит неудачу.

Toby 28.12.2018 17:39

Да, как говорит @Toby, опубликуйте соответствующий код реакции

skellertor 28.12.2018 17:42

Ладно сделаю спасибо.

CHays412 28.12.2018 17:43
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
96
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать это так

Итак, идея состоит в том, чтобы сначала создать 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 28.12.2018 17:58

@ CHays412 всегда рад помочь :)

Code Maniac 28.12.2018 18:10

Итерируйте даты записи с помощью 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);

Другие вопросы по теме