I want to create an Object of array from the flat array which i will be getting from the query results and want to create json structure as a response to pass it as api response. For eg- Flat array-
[{ user_id: '2311123', user_country: 'United States', user_city: 'ny', ssn: 229 }, { user_id: '451313', user_country: 'United States', user_city: 'abc', ssn: 147 }, { user_id: '65345', user_country: 'United States', user_city: 'abc', ssn: 444 }, { user_id: '763343', user_country: 'Australia', user_city: 'auus', ssn: 678 }]
I want to create a structure like- Expected Output
{ "United States": [ { "ny": [ { "user_id": "2311123", "ssn": "7" } ] }, { "abc": [ { "user_id": "451313", "ssn": "147" }, { "user_id": "65345", "ssn": "444" } ] } ], "Australia": [ { "auus": [ { "user_id": "763343", "ssn": "678" } ] } ] }
which has user_country array of objects and user_city array of objects mapped. I have tried this code, but coudnt achieve the expected output.:
const map = {}; results.forEach(arr => { console.log("arr",arr) if(map[arr.user_country]){ if(!map[arr.user_country].includes(arr.user_city)) map[arr.user_country].push(arr.user_city); }else{ map[arr.user_country] = [arr.user_city] } }); console.log(map);
Advertisement
Answer
This could produce expected results:
const array = [{ user_id: '2311123', user_country: 'United States', user_city: 'ny', ssn: 229 }, { user_id: '451313', user_country: 'United States', user_city: 'abc', ssn: 147 }, { user_id: '65345', user_country: 'United States', user_city: 'abc', ssn: 444 }, { user_id: '763343', user_country: 'Australia', user_city: 'auus', ssn: 678 }]; const map = array.reduce((map, {user_country, user_city, ...userInfo}) => { if (!map[user_country]) { map[user_country] = [{[user_city]: [{...userInfo}]}]; } else { const ex = map[user_country].find(city => Object.keys(city)[0] === user_city); if (!ex) { map[user_country].push({[user_city]: [{...userInfo}]}); } else { Object.values(ex)[0].push({...userInfo}); } } return map; }, {}); console.log(map);