Convert JSOn object into a flat JSON Array

Tags: ,



I have a nested JSON object that getting from a mongoDB query that i would like to convert into flat JSON array .I am using nested mondo documents, but i would like to show the data in a more readble way. My JSON has the following structure:

{
 "country": "Country A",
 "_id": "1"
 "regions": [{
        "region": "region A1",
        "cities": [{
                "city": "city A11"
            },
            {
             "city": "city A12"
            }
        ]
        },
        {
            "region": "region A2",
            "cities": [{
                    "city": "city A21"
                },
                {
                    "city": "city A22"
                }
            ]
        }
    ]
}

I want to show only the important information and not the structure of the nested array. How i can modify my data in Javascript on order to achieve the following result.

[{
"country": "Country A",
"region":"Region A1",
"city": "City A11"
},
 {
"country": "Country A",
"region":"Region A1",
"city": "City A12"
},

-------------

{
"country": "Country A",
"region":"Region A2",
"city": "City A22"
}]

I have tried to do in this way but it´s not working.

exports.get_places = (req, res, next) => {
Place.findOne({_id:req.params.id})
    .then(data => {
      let flat = arr.reduce((arr, {country, regions}) => {
          regions.forEach(({region, cities}) => {
          cities.forEach(({city}) => {
       arr.push({country, region, city})
    })
})
return arr
}, [])
console.log(flat)
    })
    .catch(error => {
        return next(error);
    });
}

Answer

I believe this will perform the transformation you seek:

const country = {
  "country": "Country A",
  "_id": "1",
  "regions": [
    {
      "region": "region A1",
      "cities": [
        {
          "city": "city A11"
        },
        {
          "city": "city A12"
        }
      ]
    },
    {
      "region": "region A2",
      "cities": [
        {
          "city": "city A21"
        },
        {
          "city": "city A22"
        }
      ]
    }
  ]
};

const flat = country.regions.flatMap(({region, cities}) =>
  cities.map(({city}) => ({country: country.country, region, city})
));

console.log(flat);


Source: stackoverflow