使用 Angular 在 JSON 文件中按 ID 搜索对象 2+

Search object by ID inside JSON file using Angular 2+

我有一个像这样的 JSON 文件,总结:

{
    "id": "1",
    "country": "Brazil",
    "state": [
        {"id": "1", "name": "Acre", 
            "city": [ { "id": "1", "name": "Rio Branco"}, 
                      { "id": "2", "name": "Xapuri"}, 
                      { "id": "3", "name": "Cruzeiro do Sul"} ] 
}

我在视图中创建了 3 个 select 选项,我必须先 select 国家,然后根据国家 ID,我需要填写第二个 select 选项与状态。在 select 州之后,我需要用城市填充第三个 select 选项。

我创建了 return 所有 JSON 文件的 PlacesService:

  getPlaces() {
    return this.http.get('assets/database/places.json')
    .map( (res: Response) => res.json());
  }

然后在我的组件中调用此服务并且运行良好:

this.placesService.getPlaces().subscribe(dados => this.places= dados);

好的,我知道如何 return JSON 文件的所有数据,但我不知道如何在 JSON 文件和 returns 仅与这些 ID 相关的对象。

我想知道如何解决这个问题以及最佳做法是什么,使用唯一 json 文件中的所有对象或划分其他 json 文件(例如:countries.json, states.json, cities.json)

更有效的方法是将它们分成单独的平面数组,然后将 "foreign keys" 添加到城市,将 countryId 添加到州。

如果您决定不划分,例如您可以从嵌套对象中找到 Array.prototype.find:

getCountry(id) {
    return this.countries.find(c => c.id === id);
}

getState(id, country) {
    return country.state.find(s => s.id === id);
}

getCity(id,state) {
    return state.city.find(c => c.id === id);
}

const city = this.getCity('2', getState('1', getCountry('1'))); // Xapuri

因此,如您所见,3 个平面阵列会使事情变得更简单。您可以通过简单的查找调用从所有城市中按 ID 找到一个城市,或者通过过滤找到一个州的所有城市:

const acreCities = cities.filter(c => c.stateId === '1');