Мой вариант использования примерно такой.
parent_region_idnull значит это провинция.parent_region_id - это идентификатор провинции, значит, это район.Моя цель - отфильтровать все города из массива. Я сделал странный способ, и он работает.
Но я хотел бы знать, что является наиболее оптимальным способом сделать это? Это мой рабочий код.
const locations = [
{id:1,name:"Western province",parent_region_id:null},
{id:2,name:"Southern province",parent_region_id:null},
{id:3,name:"Central province",parent_region_id:null},
{id:4,name:"Colombo district",parent_region_id:1},
{id:5,name:"Galle district",parent_region_id:2},
{id:6,name:"Kandy district",parent_region_id:3},
{id:7,name:"Maharagama",parent_region_id:4},
{id:8,name:"Nugegoda",parent_region_id:4},
{id:9,name:"Peradeniya",parent_region_id:6},
]
//get the province ids first
const provinces = []
locations.forEach(e=> {
if (!e.parent_region_id){
provinces.push(e.id)
}
})
// get all the districts then
const districts = []
locations.forEach(e=>{
if (provinces.includes(e.parent_region_id)){
districts.push(e.id)
}
})
//get cities
const cities = [];
locations.forEach(e=>
{
if (!districts.includes(e.id) && !provinces.includes(e.id)){
console.info(e.name," is a city")
}
})


![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Используйте Массив # фильтр и Массив # найти.
const locations=[{id:1,name:"Western province",parent_region_id:null},{id:2,name:"Southern province",parent_region_id:null},{id:3,name:"Central province",parent_region_id:null},{id:4,name:"Colombo district",parent_region_id:1},{id:5,name:"Galle district",parent_region_id:2},{id:6,name:"Kandy district",parent_region_id:3},{id:7,name:"Maharagama",parent_region_id:4},{id:8,name:"Nugegoda",parent_region_id:4},{id:9,name:"Peradeniya",parent_region_id:6},]
const res = locations.filter(({id, parent_region_id},i,a)=>{
if (!parent_region_id) return false;
const loc = a.find(l=>l.id === parent_region_id);
return !loc.parent_region_id ? false : true;
});
console.info(res);Решение путем удаления провинций сначала:
const locations=[{id:1,name:"Western province",parent_region_id:null},{id:2,name:"Southern province",parent_region_id:null},{id:3,name:"Central province",parent_region_id:null},{id:4,name:"Colombo district",parent_region_id:1},{id:5,name:"Galle district",parent_region_id:2},{id:6,name:"Kandy district",parent_region_id:3},{id:7,name:"Maharagama",parent_region_id:4},{id:8,name:"Nugegoda",parent_region_id:4},{id:9,name:"Peradeniya",parent_region_id:6},]
const res = locations
.filter(({parent_region_id})=>parent_region_id!==null)
.filter(({parent_region_id},i,a)=>{
return a.findIndex(l=>l.id === parent_region_id) > -1;
});
console.info(res);Если вы хотите сделать код чище и компактнее, попробуйте использовать filter() следующим образом:
const locations = [
{id:1,name:"Western province",parent_region_id:null},
{id:2,name:"Southern province",parent_region_id:null},
{id:3,name:"Central province",parent_region_id:null},
{id:4,name:"Colombo district",parent_region_id:1},
{id:5,name:"Galle district",parent_region_id:2},
{id:6,name:"Kandy district",parent_region_id:3},
{id:7,name:"Maharagama",parent_region_id:4},
{id:8,name:"Nugegoda",parent_region_id:4},
{id:9,name:"Peradeniya",parent_region_id:6},
];
const provinces = locations.filter(e => !e.parent_region_id);
const districts = locations.filter(e => provinces.some(p => p.id == e.parent_region_id));
const cities = locations.filter(e => !provinces.includes(e) && !districts.includes(e));
console.info(provinces);
console.info(districts);
console.info(cities);