Estoy tratando de buscar dentro de una matriz de objetos para ver si algún objeto contiene el objeto que estoy buscando y asignarlo a una variable.
Esta es la interfaz que estoy usando. Básicamente tengo una variedad de países, cada uno de los cuales tiene su propia variedad de ciudades.
import { ICity } from "./city"; export interface ICountry { name: string, capital: string, language: string, population: number, density: number, area: number, majorCities: ICity[] }
El objeto que busco es el parámetro de ciudad de esta función, pero siempre devuelve indefinido. ¿Cuál es la mejor manera de encontrar el país al que pertenece una determinada ciudad?
remove(city: ICity): void { var country; this.countries.forEach(cn => { if (cn.majorCities.includes(city)) { country = cn; console.log(cn); } }); console.log(country); }
Deberías hacer lo siguiente
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')
La mejor manera (en mi opinión) es almacenar la identificación del país en la ciudad para que pueda encontrarla más fácilmente.
Pero en este caso puedes hacerlo como a continuación:
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); }
Supongo que su objeto de tipo ICity no es solo una cadena simple, por lo que una verificación como:
if (cn.majorCities.includes(city))
simplemente devolvería verdadero si uno de los elementos de majorCities
es la instancia real a la que se hace referencia a través de la variable de city
.
Como su interfaz ICity seguramente consiste en algo así como una propiedad de nombre , por ejemplo
interface ICity { name: string }
debe verificar dicha propiedad de tipo cadena.
if (cn.majorCities.some((el) => { return el.name == city.name })) { // do something }