Невозможно получить доступ к вложенным объектам внутри JSON in Javascript - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь извлечь вложенные объекты из файла JSON. Файл JSON содержит информацию об индийских штатах и районах и выглядит примерно так: - https://api.covid19india.org/state_district_wise.json

{
"Haryana": {
    "districtData": {

      "Ambala": {
        "notes": "",
        "active": 2,
        "confirmed": 14,
        "deceased": 1,
        "recovered": 11,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Bhiwani": {
        "notes": "",
        "active": 1,
        "confirmed": 3,
        "deceased": 0,
        "recovered": 2,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Charkhi Dadri": {
        "notes": "",
        "active": 0,
        "confirmed": 1,
        "deceased": 0,
        "recovered": 1,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Faridabad": {
        "notes": "",
        "active": 18,
        "confirmed": 61,
        "deceased": 1,
        "recovered": 42,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Fatehabad": {
        "notes": "",
        "active": 0,
        "confirmed": 1,
        "deceased": 0,
        "recovered": 1,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Gurugram": {
        "notes": "",
        "active": 19,
        "confirmed": 57,
        "deceased": 0,
        "recovered": 38,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      }
    }

"Maharashtra": {
    "districtData": {
      "Other States": {
        "notes": "Cases from other States/UTs",
        "active": 24,
        "confirmed": 27,
        "deceased": 3,
        "recovered": 0,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Ahmednagar": {
        "notes": "",
        "active": 17,
        "confirmed": 42,
        "deceased": 2,
        "recovered": 23,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Akola": {
        "notes": "",
        "active": 30,
        "confirmed": 39,
        "deceased": 1,
        "recovered": 8,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Amravati": {
        "notes": "",
        "active": 17,
        "confirmed": 28,
        "deceased": 7,
        "recovered": 4,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Aurangabad": {
        "notes": "",
        "active": 131,
        "confirmed": 161,
        "deceased": 8,
        "recovered": 22,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Bhandara": {
        "notes": "",
        "active": 1,
        "confirmed": 1,
        "deceased": 0,
        "recovered": 0,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Beed": {
        "notes": "",
        "active": 0,
        "confirmed": 1,
        "deceased": 0,
        "recovered": 1,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Buldhana": {
        "notes": "Reconciled as per MH bulleting 24/04",
        "active": 1,
        "confirmed": 21,
        "deceased": 1,
        "recovered": 19,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      },
      "Chandrapur": {
        "notes": "",
        "active": 1,
        "confirmed": 3,
        "deceased": 0,
        "recovered": 2,
        "delta": {
          "confirmed": 0,
          "deceased": 0,
          "recovered": 0
        }
      }
   }
}

Приведенная выше информация представляет объекты данных округа, вложенные в государственные объекты (здесь округ эквивалентен городу). Например, Харьяна - это штат, а Амбала - это район в Харьяне. Таким образом, существует несколько штатов, и внутри каждого штата есть несколько округов. Я хочу получить доступ к активным и умершим объектам внутри районов и создать массив всех объектов округов в Индии, который содержит информацию обо всех районах, которая выглядит следующим образом: -

[
  {
   "active":
   "deceased":
   "recovered":
   "districtname":"District-A"
   "statename":
  },
  {
   "active":
   "deceased":
   "recovered":
   "districtname":"District-B"
   "statename":
  },
  {
   "active":
   "deceased":
   "recovered":
   "districtname":"District-C"
   "statename":
  },
  {
   "active":
   "deceased":
   "recovered":
   "districtname":"District-D"
   "statename":
  }
]

Я пробовал подход for...in, а также пытался преобразовать внутренние объекты в массив, но не смог правильно l oop внутри. Кто-нибудь может подсказать, как это сделать?

Ответы [ 3 ]

1 голос
/ 02 мая 2020

Я создал следующий пример. Он создаст массив объектов, содержащий имя штата, имя района, активный ключ и значения дельты.

Я использую object.entries, который возвращает массив массивов, содержащих пару значений ключа. По сути, массив кортежей. Я комбинирую это с деконструкцией объекта и оператором распространения.

const transformFlat = (obj) => {
  const result = [];
  Object.entries(obj).forEach(([stateName, { districtData }]) =>
    Object.entries(districtData).forEach(([districtName, { active, delta }]) =>
      result.push({
        state: stateName,
        district: districtName,
        active,
        ...delta,
      })
    )
  );
  return result;
};

console.log(transformFlat({
  Haryana: {
    districtData: {
      Ambala: {
        notes: '',
        active: 2,
        confirmed: 14,
        deceased: 1,
        recovered: 11,
        delta: {
          confirmed: 0,
          deceased: 0,
          recovered: 0,
        },
      },
      Bhiwani: {
        notes: '',
        active: 1,
        confirmed: 3,
        deceased: 0,
        recovered: 2,
        delta: {
          confirmed: 0,
          deceased: 0,
          recovered: 0,
        },
      },
    },
  },
  Maharashtra: {
    districtData: {
      'Other States': {
        notes: 'Cases from other States/UTs',
        active: 24,
        confirmed: 27,
        deceased: 3,
        recovered: 0,
        delta: {
          confirmed: 0,
          deceased: 0,
          recovered: 0,
        },
      },
      'Ahmednagar': {
        notes: '',
        active: 17,
        confirmed: 42,
        deceased: 2,
        recovered: 23,
        delta: {
          confirmed: 0,
          deceased: 0,
          recovered: 0,
        },
      },
    },
  },
}))
0 голосов
/ 02 мая 2020

Попробуйте использовать for l oop с Object.values()

for (let value of Object.values(obj)) {
  console.log(value);
}

obj - ваши данные.

0 голосов
/ 02 мая 2020

это один из способов прохождения через объекты oop, но я не уверен, что он самый эффективный.

const obj = {

"a": {
    
    "b":{
        "b1":1,
        "b2":2,
    },
    "c":{
      "c1":3,
      "c2":4,
    }

  } 

}


for(let key in obj){
  let val = obj[key]
  for(let k in val){
  
    let  v = val[k]
    for (let k2 in v){
      console.log(k2, v[k2])
    }
    
  }

}
...