У меня были проблемы с AngularJS 1.7 и получением объектов из бэкэнда для целей фильтрации. А именно, я получаю JSON, состоящий из тех же объектов, но некоторые являются потомками других, например:
[
{
"id":2,
"type":"CORP",
"description":"A-corpus",
"children": [
{
"id":3,
"type":"FLOOR",
"description":"1st floor",
"children":[]} ]
}
]
}
]
Все эти объекты имеют тип Place. Я не знаю глубины JSON заранее и должен пройти через него рекурсивно, чтобы получить список всех мест. Для этого я создал соответствующий объект с именем place.ts:
export class Place {
constructor(
public id: Number,
public type: String,
public description: String,
public children: Array<Place>) {}
}
@Injectable({
providedIn: 'root'
})
export class placeAdapter implements Adapter<Place> {
adapt(item: any): Place {
return new Place(
item.id,
item.type,
item.description,
item.children
);
}
}
, где адаптер является шаблоном проектирования из Использование API-интерфейсов в Angular: Шаблон-адаптер модели , который отлично работает сполучение других предметов из бэкэнда. Кроме того, у меня есть служебный текстовый сценарий с именем place.service.ts:
export class PlaceService {
constructor(private http: HttpClient, private adapter: placeAdapter) {}
public query(): Observable<Place[]> {
return this.http.get('api/places').pipe(
map((data:any[]) => {
console.log("place by type:" + data);
return data.map(item => this.adapter.adapt(item));
}));
}
Этот дизайн действительно считывал некоторые вложенные элементы с других конечных точек, но входит в бесконечный цикл, когда я пытаюсь получить эти объекты. Объекты, которые он выводит на консоль несколько раз:
место по типу: [объект Object], [объект Object]
, даже если я дам ему JSON без дочерних элементовмест. IntelliJ показывает мне бесконечные запросы на те же места и их детей. Независимо от того, сколько вложенных элементов есть в JSON, синтаксический анализ выполняется в цикле, и я ничего не могу получить, потому что цикл заставляет все приложение работать слишком медленно.
Как синтаксический анализ таких рекурсивных JSON-ов в массивах объектов выполняется в AngularJS с использованием лучших практик?