Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Преобразовать JSON объект в объект с массивами (https://javascript.ru/forum/misc/83079-preobrazovat-json-obekt-v-obekt-s-massivami.html)

tk.stas 08.09.2021 15:25

Преобразовать JSON объект в объект с массивами
 
Всем привет!
Помогите решить такую задачку.
Имеем JSON такого вида:
{
  "0": {
    "event": {
      "data": "Города",
      "citys": {
        "0": "Москва",
        "1": "Дон",
       },
    }
  },
  "1": {
    "event": {
      "data": "Города",
      "citys": {
        "0": "Москва",
        "1": "Дон",
       },
    }
  },
}


Как видно "0", "1" и тд. это объекты, но на самом деле они должны быть массивами.
Понятно что можно общий объект преобразовать в массив, затем "citys" преобразовать в массив. Но проблема в том, что данных много и вложений объектов в объекте также много.
Как бы сделать так чтобы проверялись объекты и вложенные в них объекты на существование имен "0", "1" и преобразовывать их в массивы.

Aetae 08.09.2021 15:40

tk.stas, правильный ответ: генерировать сразу по-человечески.

рони 08.09.2021 15:43

tk.stas,
подожду переводчика, но возможно вам нужно Object.values()

Aetae 08.09.2021 16:25

рони, нет, ему надо это):
function fixArraysRecursive(value) {
  if(
    // проверяем что объект
    typeof value === 'object' 
    // проверяем что простой объект, а не какой-нить Date
    && Object.prototype.toString.call(value) === '[object Object]'
  ){
    // получаем ключи объекта
    const keys = Object.keys(value);

    // проверяем что есть ключ 0
    const isArray = 0 in value 
      // если да - что все ключи числа
      && keys.every(key => key === parseInt(key, 10).toString())
      // если да - что нет пропусков
      && keys
        .map(Number)
        .sort((a, b) => a - b)
        .every((key, index) => key === index);

    const target = isArray ? Array(keys.length) : {...value};
    
    keys.forEach((key, i) => target[key] = fixArraysRecursive(value[key]));

    return target;
  }
  return value;
}

рони 08.09.2021 17:15

Aetae,
:) :thanks:

tk.stas 08.09.2021 19:41

Aetae, к сожалению такие данные приходят с сервера.

Спасибо за код.


Часовой пояс GMT +3, время: 07:17.