how can i reduce array of objects to new array of merged objects? I have following array mixed with places and their sub areas. I want to add sub_main_places to main_places like following:
"unformatted places": [
{
"name": "main_place1",
"address": "place_address1"
},
{
"name": "main_place2",
"address": "place_address2"
},
{
"name":"sub_main_place1",
"address":"sub_main_place_address1"
},
{
"name":"sub_main_place2",
"address":"sub_main_place_address2"
}
]
The result im trying to achieve is:
"formatted places": [
{
"name": "main_place1",
"address": "place_address1",
"sub_area": "sub_main_place1"
},
{
"name": "main_place2",
"address": "place_address2",
"sub_area": "sub__main_place2"
}
],
Using reduce, you can assemble an object with keys that correspond to the main address, then reference those when you encounter a sub address. At the end, you can convert the result back to an array with Object.values
let unformatted_places = [{ "name": "main_place1", "address": "place_address1" }, { "name": "main_place2", "address": "place_address2" }, { "name": "sub_main_place1", "address": "sub_main_place_address1" }, { "name": "sub_main_place2", "address": "sub_main_place_address2" } ] let formatted_places = Object.values(unformatted_places .sort((a, b) => a.name.localeCompare(b.name)) .reduce((b, a) => { let f = a.name.split('sub_')[1] if (a.name.indexOf('sub_') === 0 && b[f]) { b[f].sub_area = a.name; } else { b[a.name] = a; } return b; }, {})) console.log(formatted_places);
Tried another way:
let data_1 = { "unformatted places": [{ "name": "main_place1", "address": "place_address1" }, { "name": "main_place2", "address": "place_address2" }, { "name": "sub_main_place1", "address": "sub_main_place_address1" }, { "name": "sub_main_place2", "address": "sub_main_place_address2" } ] }; let data_2 = {} data_1["unformatted places"].forEach(function(dict) { var name = dict.name; if (name.startsWith("main")) { data_2[name] = dict; } else if (name.startsWith("sub_")) { let key = name.substring(4, name.length); if (key in data_2) { data_2[key]["sub_area"] = name; } else { data_2[key] = { "sub_area": name }; } } }); data_2 = { "formatted places": Object.values(data_2) } console.log(data_2);
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.