1

I am trying to extract nested objects inside a JSON file. The JSON file contains information about Indian states and districts and looks something like this:- 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
        }
      }
   }
}

The above information represents district data objects nested inside state objects(Here district is equivalent of a city). For example, Haryana is the state and Ambala is a district in Haryana. So there are multiple states and inside each state there are multiple districts. I want to access the active and deceased objects inside the districts and create an array of all district objects in India which contains information about all the districts which looks like this:-

[
  {
   "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":
  }
]

I have tried the for...in approach and also tried to convert the inner objects into array but was not able to loop inside properly. Can anyone suggest how to do it?

3
  • Your result array has invalid syntax. You cannot have an array with key value pairs. Please correct it so that it's either an object or remove the keys. Commented May 2, 2020 at 14:49
  • @TheFool Corrected it Commented May 2, 2020 at 15:02
  • 1
    Now I got it, that was confusing XD Commented May 2, 2020 at 15:39

3 Answers 3

1

I created following example. It will create an array of objects containing the state name the district name the active key and the delta values.

I am using object.entries which returns an array of arrays containing the key value pair. Essentially an array of tuples. I combine this with object deconstruction and the spread operator.

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,
        },
      },
    },
  },
}))

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks alot for your approach
1

this is one way of how to loop through objects but I am not sure if it's the most efficient one.

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])
    }
    
  }

}

Comments

0

Try using for loop with Object.values()

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

obj is your data.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.