Как рекурсивно погружаться через глубоко вложенные модели машинописи? И отобразить эти глубокие пути как объект [ключ: значение] - PullRequest
3 голосов
/ 26 марта 2020

У меня есть проблема.

***Feel Free to Express*****I need an idea***

Как рекурсивно погружаться через глубоко вложенные модели машинописи? И сопоставьте эти глубокие пути как объект [ключ: значение].

, где ключ - это имя столбца или идентифицируемое имя, а значение - это пройденный путь (глубина).

что я имею в виду по глубине это someObject.level1.level2.level3.level4 ... Вот так.

Представьте, что у меня есть пара интерфейсов Typescript (все внешние файлы).

Один интерфейс указывает на другой затем другой и т. д.

Например:


export interface University {
  name: string;
  type: string;
  locationDetails: Location;
  revenue: Revenue;
  departments: Departments[];
  collegesUnder: Colleges[];
  status: boolean;
}

Вот интерфейс, описывающий Местоположение

export interface Location {
  street: string;
  state: string;
  postCode: number;
}

Вот интерфейс, описывающий Отдел


export interface Departments {
  name: string;
  category: string;
  coursesOffered: Courses[];
}

Вот интерфейс, описывающий колледж

export interface College {
  collegeName: string;
  collegeLocation: Location;
  coursesOffered: Courses[];
  studentsEnrolled: Students[];
}

Вот интерфейс, описывающий студента

export interface Student {
  studentName: string;
  department: Department;
  course: Course;
  age: number;
  address: string;
  otherInfo: OtherInfo;
}

Вот интерфейс, описывающий курс

export interface Course {
  name: string;
  classifiedUnder: string;
  subCourses: Course[];
}

Так что, как вы можете, есть куча машинописных файлов. Все они являются отдельными файлами и названы в соответствии с соглашением interfaceName.model.ts. имя_интерфейса соответствует каждому имени идентификатора интерфейса. Фронтент разрабатывается с использованием Angular.

Я буду получать json данные с сервера, который содержит информацию об университетах. & все эти данные будут показаны в виде таблицы (без вложенности).

В верхней части каждого заголовка у меня будет поле ввода &, поскольку типы использования в таблице отфильтровываются.

Для глубокого поиска мне нужно получить доступ к глубоко вложенным путям этих моделей. И мне придется делать это отдельно для каждого типа поисковых запросов.

& всякий раз, когда какое-либо свойство добавляется заново в любой из этих интерфейсов, мне придется приходить и вносить соответствующие изменения.

Поэтому я придумаю решение:

для сопоставления каждого имени столбца с глубиной объекта:

Например, если пользователь ищет в столбце Имя ученика:

return universities.filter(university => {
retrurn university.colleges.some(college => {
return college.students.some(student => {
return student.name
})
})
})

Итак, моя идея состоит в том, чтобы сопоставить имя каждого столбца с каждой глубиной, чтобы я мог получить к нему прямой доступ:

следующим образом:

searchMap = {
universityName: university.name,
universityType: university.type;
universityLocationStreet: university.location.street;
universityLocationState: university.location.state;
universityLocationPostcode: university.location.postcode;

... Like so...

studentsName: university[i].colleges[j].students[k].student.name
// see how the nesting goes on... 
}

Таким образом, смысл в том, что если какие-либо изменения появляются в файлах typescript.model.ts (в будущем, если они внесут какие-либо изменения в свойства), я хочу управлять им автоматически.

Поэтому я хочу найти решение для рекурсивного сканирования через эти интерфейсы машинописи (которые все внешние и будут импортированы внутри определений типов) и сделают из него объект searchMap (карту глубины).

Будет очень полезно, если вы сможете что-то выяснить * 10 60 *

ответ на комментарии

* Это реальный сценарий.

* Это рекурсия. Потому что, когда он находит определение другого типа (которое снова является другим объектом), код должен будет выполнить ту же процедуру, чтобы углубиться в этот новый объект, а затем добавить все эти глубины следующим образом: Object.depth1.depth2.depth3.depth4 et c ...

** Это не странная идея. Вы можете найти сходство с vscode или вашей IDE IntelliSense. & поскольку мы печатаем в каждой глубине (для определенных интерфейсов), мы можем получить доступ к этим свойствам глубины. Здесь я хочу просто проследить эти пути автоматически и объединить их вместе, а затем сопоставить их с объектом с помощью идентифицируемого ключевого слова, чтобы всякий раз, когда мне нужно было получить доступ к этим глубинам / уровням, мне просто нужно поместить этот ключ на объект.

...