2

My use case is something like this.

  • I have an array of objects called locations.
  • It contains information about Provinces, Districts and cities.
  • City belongs to a District, District belongs to a Province.
  • If parent_region_id null means it is a province.
  • If parent_region_id is a province's id means it is a district.
  • Otherwise it's a city.

My goal is to filter out all the cities from the array. I did a odd way and it works though.

But I would like to know what is most optimal way to do this? This is my working code.

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.log(e.name," is a city")
  }
})

2 Answers 2

2

Use Array#filter and Array#find.

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.log(res);

Solution by removing the provinces first:

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.log(res);

Sign up to request clarification or add additional context in comments.

Comments

0

If you want to make the code cleaner and more compact, try using filter() like so:

 

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.log(provinces);
console.log(districts);
console.log(cities);

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.