Невозможно задать свойства неопределенного путем итерации вложенного JSON

#javascript #json #typescript

Вопрос:

У меня есть вложенный JSON, он структурирован следующим образом: введите описание изображения здесь

Как вы можете видеть, JSON называется bwaResult, и в этом объекте есть три большие группы. Эти группы называются actBwa, fcBwa и planBwa. Эти группы содержат годы и годовые результаты(суммы), которые также имеют годы. Я хотел бы присвоить значения отдельным годам. Это означает, что в 2020 году у вас будут значения actBwa, fcBwa, planBwa и результаты за год, и то же самое для других лет.

Мой Код:

  const plMonthResults = {};
        const plMonth = resp.success ? resp.bwaResult : null; // JSON-DATA
        delete resp.success;
        if (plMonth amp;amp; plMonth !== null amp;amp; Object.keys(plMonth)) {
          let count = 0;
          for (const bwaType in plMonth) {
            const plMonthData = plMonth[bwaType]; // Here I get actBwa, fcBwa, planBwa
            if (count === 0) {
              for (const yearKey of Object.keys(plMonthData)) {
                plMonthResults[yearKey] = {}; // Sort by years
              }
            }
            for (const yearKeyInPlMonth in plMonthData) {
              plMonthResults[yearKeyInPlMonth][bwaType] = plMonthData[yearKeyInPlMonth]; // Here then arises the error
            }
            count  = 1;
          }
        }
 

Когда я запускаю код, я получаю следующую ошибку:

 ERROR TypeError: Cannot set properties of undefined (setting 'fcBwa')
 

Я предполагаю, что, поскольку у actBwa есть только 2020 год, а у других групп больше лет, существует проблема с поиском fcBwa и дальнейшим повторением, или я вижу это неправильно? Можете ли вы сказать мне, как решить эту проблему?

ОБНОВИТЕ мою работу в stackblitz: https://stackblitz.com/edit/read-local-json-file-service-udqvck?file=src/app/app.component.ts

Комментарии:

1. Было бы намного проще ответить на ваш вопрос, если бы вы привели воспроизводимый пример.

2. Теперь я создам пример в StackBlitz, где вы можете отслеживать вывод с помощью console.log…

3. я составил карту этого дела в СтакбЛитце. Было бы здорово, если бы вы могли мне помочь. Пожалуйста, посмотрите на вывод в консоли

Ответ №1:

Похоже, что вы используете count для копирования ключей только один раз, но это означает, что у вас будут ключи только от первого объекта (в данном случае actBwa ). Вместо этого вы можете просмотреть ключ каждого объекта, но убедитесь, что вы не переопределяете существующие. Поэтому удалите count и измените внешний вид следующим образом

        for (const yearKey of Object.keys(plMonthData)) {
          plMonthResults[yearKey] = plMonthResults[yearKey] ?? {};
        }
 

Вы даже можете удалить этот цикл и включить проверку в основной:

    for (const yearKeyInPlMonth in plMonthData) {
          plMonthResults[yearKeyInPlMonth] = plMonthResults[yearKeyInPlMonth] ?? {};
          plMonthResults[yearKeyInPlMonth][bwaType] = plMonthData[yearKeyInPlMonth]; 
        }
 

Дайте мне знать, если это даст вам желаемый результат

Комментарии:

1. Работает. Все может быть так просто.