0

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);
  }
2
  • is ICity an object? If so you can't use includes unless you are looking for strict reference equality. You will need to look for a matching property of city either in a find(), findIndex() call, or if you just want to establish if it exists in the array you can use some(). ie. if (cn.majorCities.some(c => c.name === city.name)) {... Commented Jan 9, 2022 at 13:43
  • 1
    Does this answer your question? How to determine if Javascript array contains an object with an attribute that equals a given value? Commented Jan 9, 2022 at 13:52

3 Answers 3

1

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);
}
Sign up to request clarification or add additional context in comments.

4 Comments

This is no different than the OP's current code and assumes city is a string
it is a lot different because arrays don't support includes
You just teach me something. thanks man.
1

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
}

Comments

1

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')

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.