Как я могу найти конкретный новый объект класса, который имеет аргумент конструктора, равный вводу - PullRequest
0 голосов
/ 01 мая 2019

У меня есть класс Country с четырьмя параметрами конструктора.

Затем я создаю несколько новых стран из этого класса с указанными значениями.

У меня вопрос, как я могу создать метод, которыйможет найти и вернуть объект с значением this.value, равным входу в методе?

class Country {

  constructor(name, area, population, topdomain) {
    this.name = name;
    this.area = area;
    this.population = population;
    this.topdomain = topdomain;
  }

  static findCountry = domain => {
    /*Here is where the magic should happen. 
      If domain is in any of the countries below, then it should return the country name.
     */
  }
}

norway = new Country("Norway", 323802, 5320045, ".no");
sweden = new Country("Sweden", 450295, 9960487, ".se");
russia = new Country("Russia", 17098242, 142257519, ".ru");
china = new Country("China", 9596960, 1379302771, ".cn");

Эта функция должна возвращать "Norway":

Country.findCountry(".no");

Ответы [ 3 ]

0 голосов
/ 01 мая 2019

Не приходите сюда, чтобы попросить людей написать ваш код;)

class Country {
    constructor(name, area, population, topdomain) {
        this.name = name;
        this.area = area;
        this.population = population;
        this.topdomain = topdomain;
        Country._ALL.push(this);
    }
    static findBy(key, value) {
        let output = [];
        for ( let i in Country._ALL) {
            let c = Country._ALL[i];
            if (c.hasOwnProperty(key) && c[key] === value)
                output.push(c);
        }
        return output;
    }
}
Country._ALL = [];

ВНИМАНИЕ! Классы ES6 не поддерживают статические переменные, такие как static variable = []; Если вам нужны статические переменные класса в ES6, вы должны использовать ClassName.variable = []; после объявления класса.

0 голосов
/ 01 мая 2019

Ваш класс не знает о 4 объектах, которые вы где-то создали. Вам необходимо поместить их в коллекцию (например, массив), а затем явно указать эту коллекцию в своем методе поиска:

class Country {
  constructor(name, area, population, topdomain) {
    this.name = name;
    this.area = area;
    this.population = population;
    this.topdomain = topdomain;
  }

  static findCountry(domain) {
    return (knownCountries.find(country => country.topdomain == domain) || {}).name;
//          ^^^^^^^^^^^^^^
  }
}

const norway = new Country("Norway", 323802, 5320045, ".no");
const sweden = new Country("Sweden", 450295, 9960487, ".se");
const russia = new Country("Russia", 17098242, 142257519, ".ru");
const china = new Country("China", 9596960, 1379302771, ".cn");

const knownCountries = [norway, sweden, russia, china];
//    ^^^^^^^^^^^^^^
0 голосов
/ 01 мая 2019

Чтобы это работало, класс должен хранить список всех созданных экземпляров.Поскольку у JS нет слабых ссылок, это будет означать, что ни один из экземпляров никогда не может быть собран мусором (поэтому будьте осторожны):

 static instances = [];

 constructor(/*...*/) {
   /*...*/
   Country.instances.push(this);
 }

 static findCountry = domain => {
  return this.instances.find(country => country.domain === domain);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...