Reputation: 39
I'm trying to search inside an object array to see if any object contains the object I'm looking for and assign it to a variable.
This is the interface that I'm using. Basically I have an array of countries, each of which has it's own array of cities.
import { ICity } from "./city";
export interface ICountry {
name: string,
capital: string,
language: string,
population: number,
density: number,
area: number,
majorCities: ICity[]
}
The object I'm looking for is the city parameter of this function, but it always returns undefined. What is the best way to find country which a certain city belongs to?
remove(city: ICity): void {
var country;
this.countries.forEach(cn => {
if (cn.majorCities.includes(city)) {
country = cn;
console.log(cn);
}
});
console.log(country);
}
Upvotes: 0
Views: 73
Reputation: 884
You should do like below
const countries = [{
name: 'Iran',
cities: ['Shiraz', 'Tehran']
},
{
name: 'Germay',
cities: ['Berlin']
}
]
const findCity = (city) => {
countries.forEach(country => {
if (country.cities.includes(city))
console.log(city, 'has founded!')
})
}
findCity('Shiraz')
Upvotes: 1
Reputation: 12891
Your ICity type object is not just a simple string I assume, so a check like:
if (cn.majorCities.includes(city))
would just return true if one of majorCities
elements is the actual instance referenced via the city
variable.
As your ICity interface surely consists of something like a name property e.g.
interface ICity {
name: string
}
you should check for such a string-type property.
if (cn.majorCities.some((el) => {
return el.name == city.name
})) {
// do something
}
Upvotes: 1
Reputation: 7396
The best way (in my opinion) is to store country id in city so you can find it easier.
But in this case you can do it like below:
remove(city: ICity): void {
var country;
this.countries.forEach((cn) => {
if (cn.majorCities.find(c => c.toLowerCase() === city.toLowerCase())) {
country = cn;
console.log(cn);
}
});
console.log(country);
}
Upvotes: 1