#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. Работает. Все может быть так просто.