I have incoming data in this format:
const worldMap = [ { "name": "Germany", "parentId": null, "type": "Country", "value": "country:unique:key:1234", "id": "1", }, { "name": "North Rhine", "parentId": "1", "type": "State", "value": "state:unique:key:1234", "id": "2", }, { "name": "Berlin", "parentId": "1", "type": "State", "value": "state:unique:key:1234", "id": "3", }, { "name": "Dusseldorf", "parentId": "2", "type": "city", "value": "city:unique:key:1234", "id": "4", }, { "name": "India", "parentId": null, "type": "Country", "value": "country:unique:key:1234", "id": "5", }, ];
I want the output to be something like this:
[ { label: "Germany", value: "country:unique:key:1234", subs: [ { label: "North Rhine", value: "state:unique:key:1234", subs: [ { label: "Dusseldorf", value: "city:unique:key:1234", } ] }, { label: "Berlin", value: "state:unique:key:1234", } ] } , { "label": "India", "value": "country:unique:key:1234" } ]
Basically, it is a three dimensional array with first level being the Countrie, second States and third Cities. I have tried the following code:
let tempCountries = []; worldMap.map((world) => { if (world.parentId == null && world.type == "Country") { tempCountries.push({label: world.name, value: world.value, id: world.id}); } }); tempCountries.map((tempCountry) => { const states = worldMap.find((x) => x.parentId == tempCountry.id); console.log("=== states ===", states); if (states !== undefined) { tempCountries.find((x)=>x.id == tempCountry.id).children.push(states) } });
But the above code works upto second level and does not add cities to states. Could anyone please help me achieve this ?
Thanks a lot!
Advertisement
Answer
You can use a recursive solution:
function convertToTree(layer, parentId = null) { const vertex = new Map(), others = []; layer.forEach(item => { if (item.parentId === parentId) { vertex.set(item.id, { label: item.name, value: item.value }); } else { others.push(item); } }); for (const vertexId of vertex.keys()) { const subs = convertToTree(others, vertexId); if (subs.length) { vertex.get(vertexId).subs = subs; } } return [...vertex.values()]; }