Поиск по объектам JavaScript

398
22 октября 2017, 23:51

Здравствуйте, помогите пожалуйста решить мою задачу. У меня есть три таблицы в базе данных: Материк, Страна, Город.

Мне нужно по названию города определить страну и материк. Как я понимаю, для этого нужно перебрать Материки, Страны и Города, но я абсолютно не понимаю как это сделать, чтобы в итоге я получил три переменные с тремя id (материк, страна, город).

Вот как выглядит база данных:

Таблица “Материки”
id материка  , name материка

.

Таблица “Страны”
id страны , id материка , name страны

.

Таблица “Города”
id города , id страны , name города

Я уже получил материки из базы данных и поместил их в Объекты. Нужно чтобы алгоритм перебирал внутри каждого материка страны и внутри каждой страны города до тех пор, пока не найдет города. Когда город найден, нужно чтобы у меня были переменные с id города, материка и страны.

Сразу загружать все города будет очень долго, поэтому думаю, что перебирать поочереди будет лучше. Возможно ошибаюсь.

Я изучаю JS, других языков не знаю, поэтому на JS нужно.

Как выглядят json:

{"id":1,"materik":"name"}
{"id":1,"materik_id":2,"strana":"name"}
{"id":1,"strana_id":2,"gorod":"name"}

Города не пересекаются, так как в каждой стране на своём языке написано название.

Можете написать код, который позволит мне по name города определить id страны и материка ? Сам не могу разобраться , на готовом примере будет куда проще вникнуть..

Answer 1

var continents = [ 
  {"id":1,"materik":"Africa"}, 
  {"id":2,"materik":"America"} 
]; 
 
var countries = [ 
  {"id":1,"materik_id":"2","strana":"Canada"}, 
  {"id":2,"materik_id":"1","strana":"Gabon"} 
]; 
 
var cities = [ 
  {"id":1,"strana_id":"1","gorod":"Toronto"} 
]; 
 
 
 
var cityName = "Toronto"; 
 
var city = cities.find(function(item){  
  return item.gorod == cityName;  
}); 
if (city) { 
  var country = countries.find(function(item){  
    return item.id == city.strana_id;  
  }); 
  if (country) { 
    var continent = continents.find(function(item){ 
      return item.id == country.materik_id; 
    }); 
     
    console.log(city); 
    console.log(country); 
    console.log(continent); 
  } 
}

Answer 2

При правильном подходе ваши структуры данных будут иметь вид

var continents = {
  "1": {"materik":"Africa"},
  "2": {"materik":"America"}
};
var countries = {
  "1": {"materik_id":"2","strana":"Canada"},
  "2": {"materik_id":"1","strana":"Gabon"}
};
var cities = {
  "1": {"strana_id":"1","gorod":"Toronto"}
};

Далее, при правильном подходе извлечения чего-либо из данных по названию города не будет производиться. Вместо этого будет производиться извлечение по ID.

Примерно так в целом:

continents[countries[cities[1].strana_id].materik_id].materik

При еще более правильном подходе все это будет делаться на стороне базы данных, поскольку в реальном мире городов очень много, и эти данные не удастся закэшировать на клиенте, чтобы разгрузить сервер, или я не знаю, на что вы еще рассчитывали с подходом из вопроса. В принципе, это целесообразно только в том случае, если вы на сервисе на базе Node.js хотите закэшировать таблицы в памяти.

READ ALSO
Раскрывающийся pie chart d3.js

Раскрывающийся pie chart d3.js

Раскрывать элемент диаграммы по которому кликнулиНа входе такой массив, где child - это это те элементы, которые надо раскрыть

317
Поддержка подсветки и синтаксиса JSX

Поддержка подсветки и синтаксиса JSX

Изучаю библиотеку React и использую Brackets

226
Проблема с heic форматом

Проблема с heic форматом

Проблема при конвертации heic в jpgИспользую официальную библиотеку на js

276
Как создать тип и использовать?

Как создать тип и использовать?

В официальном гайде angular2 для сущности Hero рекомендуется использовать пользовательский тип для данных:

360