首页 > 解决方案 > 如何递归地深入嵌套的打字稿模型?并将这些深层路径映射为对象 [key: value]

问题描述

我有一个挑战。

如何递归地深入嵌套的打字稿模型?并将这些深层路径映射为对象 [key: value]。

其中 key - 是列名或可识别的名称 & value 是遍历的路径(深度)。

我所说的深度是这个 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 命名。interfaceName 对应于每个接口标识符名称。前端正在使用 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(深度图)对象。

标签: javascriptarraysangulartypescriptjavascript-objects

解决方案


推荐阅读