как сгруппировать данные объекта по значению и дать ключевому объекту конкретное c имя? - PullRequest
1 голос
/ 19 марта 2020

Привет всем, кто нуждается в помощи для форматирования этого объекта определенным образом c:

[
  {
    data: '2020-02-24 18:00:00',
    stato: 'ITA',
    codice_regione: 10,
    denominazione_regione: 'Umbria',
    lat: 43.10675841,
    long: 12.38824698,
    ricoverati_con_sintomi: 0,
    terapia_intensiva: 0,
    totale_ospedalizzati: 0,
    isolamento_domiciliare: 0,
    totale_attualmente_positivi: 0,
    nuovi_attualmente_positivi: 0,
    dimessi_guariti: 0,
    deceduti: 0,
    totale_casi: 0,
    tamponi: 0
  },
  {
    data: '2020-02-25 18:00:00',
    stato: 'ITA',
    codice_regione: 10,
    denominazione_regione: 'Umbria',
    lat: 43.10675841,
    long: 12.38824698,
    ricoverati_con_sintomi: 0,
    terapia_intensiva: 0,
    totale_ospedalizzati: 0,
    isolamento_domiciliare: 0,
    totale_attualmente_positivi: 0,
    nuovi_attualmente_positivi: 0,
    dimessi_guariti: 0,
    deceduti: 0,
    totale_casi: 0,
    tamponi: 8
  },
  {
    data: '2020-02-24 18:00:00',
    stato: 'ITA',
    codice_regione: 11,
    denominazione_regione: 'Marche',
    lat: 43.61675973,
    long: 13.5188753,
    ricoverati_con_sintomi: 0,
    terapia_intensiva: 0,
    totale_ospedalizzati: 0,
    isolamento_domiciliare: 0,
    totale_attualmente_positivi: 0,
    nuovi_attualmente_positivi: 0,
    dimessi_guariti: 0,
    deceduti: 0,
    totale_casi: 0,
    tamponi: 16
  },
  {
    data: '2020-02-25 18:00:00',
    stato: 'ITA',
    codice_regione: 11,
    denominazione_regione: 'Marche',
    lat: 43.61675973,
    long: 13.5188753,
    ricoverati_con_sintomi: 0,
    terapia_intensiva: 0,
    totale_ospedalizzati: 0,
    isolamento_domiciliare: 0,
    totale_attualmente_positivi: 0,
    nuovi_attualmente_positivi: 0,
    dimessi_guariti: 0,
    deceduti: 0,
    totale_casi: 0,
    tamponi: 21
  }
]

Мне нужно что-то вроде этого, для групп значение всех дней с этой лекции данных в данных модель, подобная этой, с названием региона и всеми характеристиками, относящимися к этому региону.

[
  {
    "Umbria":[
      {
        "ricoverati_con_sintomi":{
          "name":"ricoverati_con_sintomi",
          "data":[
            ["2020-02-24 18:00:00",0],
            ["2020-02-25 18:00:00",0]
          ]
        }
      "terapia_intensiva":{
          "name":"terapia_intensiva",
          "data":[
            ["2020-02-24 18:00:00",0],
            ["2020-02-25 18:00:00",0]
          ]
        }
       ... other values of the orinal json ...
      }
    ],
    "Marche":[
      {
        "ricoverati_con_sintomi":{
          "name":"ricoverati_con_sintomi",
          "data":[
            ["2020-02-24 18:00:00",0],
            ["2020-02-25 18:00:00",0]
          ]
        },
        "terapia_intensiva":{
          "name":"terapia_intensiva",
          "data":[
            ["2020-02-24 18:00:00",0],
            ["2020-02-25 18:00:00",0]
          ]
        }
      ... other values of the orinal json ...
      }
    ]
  }
]

Мне нужно все значение оригинала json, но не это

   stato: 'ITA',
      codice_regione: 10,
      denominazione_regione: 'Umbria',
      lat: 43.10675841,
      long: 12.38824698,

Понятия не имею, как это сделать! пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 19 марта 2020

Вы пытались уменьшить функции в javascript? Похоже, это то, что вам нужно.

От массива -> к отображаемому объекту.

[
  {
    "regione": "marche",
    "dato 1": "test 1",
    "dato 2": "test 2"
  },
  {
    "regione": "piemonte",
    "dato 1": "test 3",
    "dato 2": "test 4"
  }
].reduce((acc, curr) => {
  acc[curr.regione] = Object.keys(curr).reduce((data, currKey) => {
    data[currKey] = curr[currKey];
    return data;
  }, {});
  return acc;
}, {});

Пожалуйста, используйте этот пример, чтобы ознакомиться с методом Reduce и применить ваши логики c к обращаться с JSON.

1 голос
/ 19 марта 2020

Предположим, что данные в вашем первом фрагменте хранятся в списке с именем list. Я займусь этим шаг за шагом, чтобы вы могли лучше понять решение. Пожалуйста, обратите внимание, что это не будет оптимизированным решением для дальнего удара, но будет простым, которому легко следовать.

Я также избегу любого использования map, filter , reduce или аналогичный в пользу перебора списка, записей объектов или ключей объекта через for ... of l oop, чтобы минимизировать любой незнакомый синтаксис. Ссылки на объяснения используемого синтаксиса, которые могут быть незнакомы, можно найти в конце ответа. Не стесняйтесь задавать мне любые вопросы в комментариях.

Шаг 1: Группировка по регионам

Сгруппируйте все данные в словаре, где имя региона - это ключ, а элемент - элемент списка. .

const dataByRegion = {};
for (const item of list) {
   if (!dataByRegion[item.denominazione_regione]) {
       // create a list if it does not exist
       dataByRegion[item.denominazione_regione] = [];
   }
   // add item to list
   dataByRegion[item.denominazione_regione].push(item);
}

Шаг 2: Группировка по характеристикам c

Теперь есть два способа go об этом, если все предметы имеют одинаковые характеристики, просто сохраните их в списке с именем CHARACTERISTIC_NAMES, если нет, но вы знаете свойства, которые не являются характерными c именами, запишите их в список с именем NOT_CHARACTERISTIC_NAMES:

const CHARACTERISTIC_NAMES = ['ricoverati_con_sintomi', 'terapia_intensiva', ...]
const NOT_CHARACTERISTIC_NAMES = ['dato', 'stato', 'denominazione_regione'...]

Теперь итерируйте по каждому из перечисляет в словаре и группирует их в новый, который по регионам и характеристикам c (то есть это словарь, который имеет имя региона для своего ключа и другой словарь для его значения, где ключом является характеристика c).

const dataByRegionAndCharacteristic = {};
for (const [region_name, list] of Object.entries(dataByRegion)) {
    dataByRegionAndCharacteristic[region_name] = {}
    for (const item of list) {
        for (const key of Object.keys(item)) {
             if (/* key **is not** a part of CHARACTERISTIC_NAMES or **is** a part of NOT_CHARACTERISTIC_NAMES */) {
                 continue;
             }
             if (!dataByRegionAndCharacteristic[region_name][key]) {
                 dataByRegionAndCharacteristic[region_name][key] = [];
             }
             dataByRegionAndCharacteristic[region_name][key].push(item);
        }
    }
}

Шаг 3: избавиться от лишних данных

Вы заметите, что dataByRegionAndCharacteristic близко к тому, что вы хотите достичь sh, но вам нужен только один объект для каждого региона и характеристики c пара, которая имеет свое имя и массив пар даты и числа, давайте создадим v2, в котором данные отформатированы следующим образом:

const dataByRegionAndCharacteristicV2 = {};
for (const [region_name, dataByCharacteristic] of Object.entries(dataByRegionAndCharacteristic)) {
    dataByRegionAndCharacteristicV2[region_name] = {};
    for (const [name, list] of Object.entries(dataByRegionAndCharacteristic[region_name])) {
        dataByRegionAndCharacteristicV2[region_name][name] = { name: name, data: [] };
        for (const item of list) {
            const dateAndCountPair = [item.dato, item[name]];
            dataByRegionAndCharacteristicV2[region_name][name].push(dateAndCountPair);
        }
    }
}

Шаг 4. Внутренний словарь на самом деле является массивом

Вы заметите, что dataByRegionAndCharacteristicV2 немного отличается от необходимого формата. Внутренняя часть должна быть не объектом, а списком, поэтому давайте сделаем v3 для правильного ее форматирования:

const dataByRegionAndCharacteristicV3 = {};
for (const [region_name, dataByCharacteristic] of Object.entries(dataByRegionAndCharacteristic2)) {
    dataByRegionAndCharacteristicV3[region_name] = [];
    for (const [name, data] of Object.entries(dataByRegionAndCharacteristicV2[region_name])) {
        const obj = { [name]: data };
        dataByRegionAndCharacteristicV3[region_name].push(obj);
    }
}

И все готово: D


Дополнительно

Шаги 2-4 можно легко выполнить как часть того же l oop, я разделил их для удобства чтения. Более того, все шаги могут быть частью одного l oop. Ни один из этих шагов не требует дополнительной памяти для запоминания того, что было в каком-либо элементе до или после, вам просто нужно правильно структурировать ваши данные с самого начала и заполнить их соответствующим образом.


Синтаксические ресурсы:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...