Как получить данные из сложной модели на клиенте?

Подскажите как получить из данного объекта список кварталов и городов? Например:

├── 2024_3
│    ├──  Абакан 
│    ├──  Воронеж 
├── 2024_4
│    ├──  Омск
│    ├──  Воронеж

Пример данных полученных к сервера.

[
  {
    "2024_3": [
      {
        "Абакан": [
          {
            "Петрушник С.": [
              {
                "director": "Петрушник С.",
                "completion_date": "12.09.2024",
                "total_task": 3
              }
            ]
          },
          {
            "Сидоров И.": [
              {
                "director": "Сидоров И.",
                "completion_date": "14.09.2024",
                "total_task": 2
              }
            ]
          }
        ]
      },
      {
        "Воронеж": [
          {
            "Сидоров И.": [
              {
                "director": "Сидоров И.",
                "completion_date": "16.09.2024",
                "total_task": 1
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "2024_4": [
      {
        "Омск": [
          {
            "Хрюкин А.": [
              {
                "director": "Хрюкин А.",
                "completion_date": "13.11.2024",
                "total_task": 4
              }
            ]
          }
        ]
      },
      {
        "Воронеж": [
          {
            "Сидоров И.": [
              {
                "director": "Сидоров И.",
                "completion_date": "15.11.2024",
                "total_task": 2
              }
            ]
          }
        ]
      }
    ]
  }
]

Пример обработки данной модели данных.

    function renderReport(model) {
        let convert = JSON.stringify(model);
        var obj = JSON.parse(convert);

          for (quarterItem in obj) {
            console.log("Кварталы --> " + Object.keys(obj[quarterItem]));
           //  console.log(Object.values(obj[quarterItem]));  

            const locations = Object.values(obj[quarterItem]);
            for (item in locations) {
                console.log("item --> " + Object.values(locations[item]));  
            }
        }
    };

Ответы (1 шт):

Автор решения: Grundy

Для решения для каждого элемента нужно взять его ключи и в качестве значения - получить список ключей из массива значений.

Для получения списка пар ключ-значения можно использовать метод Object.entries.

Для получения списка ключей из объекта Object.keys

Для получения одного списка на основе другого: .map и .flatMap (если полученные вложенные списки нужно объединить в один)

var data = [
  {
    "2024_3": [
      {
        "Абакан": [
          {
            "Петрушник С.": [
              {
                "director": "Петрушник С.",
                "completion_date": "12.09.2024",
                "total_task": 3
              }
            ]
          },
          {
            "Сидоров И.": [
              {
                "director": "Сидоров И.",
                "completion_date": "14.09.2024",
                "total_task": 2
              }
            ]
          }
        ]
      },
      {
        "Воронеж": [
          {
            "Сидоров И.": [
              {
                "director": "Сидоров И.",
                "completion_date": "16.09.2024",
                "total_task": 1
              }
            ]
          }
        ]
      }
    ]
  },
  {
    "2024_4": [
      {
        "Омск": [
          {
            "Хрюкин А.": [
              {
                "director": "Хрюкин А.",
                "completion_date": "13.11.2024",
                "total_task": 4
              }
            ]
          }
        ]
      },
      {
        "Воронеж": [
          {
            "Сидоров И.": [
              {
                "director": "Сидоров И.",
                "completion_date": "15.11.2024",
                "total_task": 2
              }
            ]
          }
        ]
      }
    ]
  }
];

function f(obj){
  return obj.flatMap(o => Object.entries(o).map(([key, val])=>({
  [key]:val.flatMap(v=>Object.keys(v))})))
}

console.log(f(data))

→ Ссылка