Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 08.09.2021, 15:25
Аспирант
Отправить личное сообщение для tk.stas Посмотреть профиль Найти все сообщения от tk.stas
 
Регистрация: 25.02.2015
Сообщений: 41

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


Как видно "0", "1" и тд. это объекты, но на самом деле они должны быть массивами.
Понятно что можно общий объект преобразовать в массив, затем "citys" преобразовать в массив. Но проблема в том, что данных много и вложений объектов в объекте также много.
Как бы сделать так чтобы проверялись объекты и вложенные в них объекты на существование имен "0", "1" и преобразовывать их в массивы.
Ответить с цитированием
  #2 (permalink)  
Старый 08.09.2021, 15:40
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

tk.stas, правильный ответ: генерировать сразу по-человечески.
__________________
29375, 35
Ответить с цитированием
  #3 (permalink)  
Старый 08.09.2021, 15:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

tk.stas,
подожду переводчика, но возможно вам нужно Object.values()
Ответить с цитированием
  #4 (permalink)  
Старый 08.09.2021, 16:25
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,492

рони, нет, ему надо это):
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;
}
__________________
29375, 35

Последний раз редактировалось Aetae, 08.09.2021 в 16:40.
Ответить с цитированием
  #5 (permalink)  
Старый 08.09.2021, 17:15
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Aetae,
Ответить с цитированием
  #6 (permalink)  
Старый 08.09.2021, 19:41
Аспирант
Отправить личное сообщение для tk.stas Посмотреть профиль Найти все сообщения от tk.stas
 
Регистрация: 25.02.2015
Сообщений: 41

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

Спасибо за код.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Преобразовать объект в массив SolomonRei Элементы интерфейса 4 27.12.2018 20:44
Не приходит json объект ie9 Fierfoxik Internet Explorer 0 07.07.2017 17:56
как преобразовать json в icalendar? DivMan AJAX и COMET 3 11.02.2017 22:50
Создать Json объект на основе разметки Scantraxx Общие вопросы Javascript 18 12.12.2016 17:06
Получить из mysql json строку и преобразовать в js объект 0leg9 AJAX и COMET 7 18.10.2014 15:21