Обратите внимание на согласованность данных, например, null
/ 0
.
.map
вернуть другой массив, в случае, если это не так, лучше использовать .forEach
Избегайте модифицировать структуры во время итерации.
const data = [{
"Id": 1891,
"AirportCode": "DUB",
"AirportName": "Dublin Airport",
"AirportCity": "Dublin",
"Priority": 1,
"SubPriority": 0
}, {
"Id": 1921,
"AirportCode": "DXB",
"AirportName": "Dubai International Airport",
"AirportCity": "Dubai",
"Priority": 1,
"SubPriority": 0
}, {
"Id": 1680,
"AirportCode": "DBN",
"AirportName": "Dublin Municipal Airport",
"AirportCity": "Dublin",
"Priority": 2,
"SubPriority": 1
}, {
"Id": 8973,
"AirportCode": "XNB",
"AirportName": "United Arab Emirates - Bus Station",
"AirportCity": "Dubai",
"Priority": 2,
"SubPriority": 1
}, {
"Id": 6062,
"AirportCode": "PSK",
"AirportName": "New River Valley Airport",
"AirportCity": "Dublin",
"Priority": 3,
"SubPriority": 1
}, {
"Id": 1681,
"AirportCode": "DBO",
"AirportName": "Dubbo Airport",
"AirportCity": "Dubbo",
"Priority": 99,
"SubPriority": 0 // null - Inconsistent !!!
}];
const grouped = group(data);
window.result.innerHTML = JSON.stringify(grouped, null, 2);
function group(data){
const [main, subs] = data.reduce(([main, subs], item) => {
if (item.SubPriority === 0) {
return [main.concat(item), subs];
}
const subList = subs.get(item.AirportCity) || [];
subs.set(item.AirportCity, subList.concat(item));
return [main, subs];
}, [[], new Map()]);
return main.map((item) => Object.assign(item, {SubAirport: subs.get(item.AirportCity) || []}));
}
<pre id="result"/>