
本文详解如何将具有父子层级结构的嵌套 JSON 数据(如含 children 数组的父对象)转换为符合 mat-table 要求的扁平化一维数据源,并正确渲染多列(如 Child Name / Parent Name),避免 HTML 结构错位与表头对齐失效问题。
本文详解如何将具有父子层级结构的嵌套 json 数据(如含 `children` 数组的父对象)转换为符合 `mat-table` 要求的**扁平化一维数据源**,并正确渲染多列(如 child name / parent name),避免 html 结构错位与表头对齐失效问题。
在 Angular Material 中, ✅ 正确解法:预处理数据,实现“嵌套 → 扁平”映射 你需要在组件中将原始嵌套数据转换为“每个孩子一行”的扁平数组,例如: 对应模板即可使用标准 mat-table 语法,简洁清晰、语义正确: ? 为什么原方案失败? ? 进阶提示: 通过预处理实现数据扁平化,既符合 Angular Material 的设计契约,又保障了可维护性、可测试性与样式一致性——这是构建专业级嵌套表格的最佳实践。 只能作为 中,否则浏览器会自动修正 DOM,导致表头与单元格错位、样式失效。 // component.ts
export class NestedTableComponent implements OnInit {
displayedColumns = ['childName', 'parentName'];
parents = [
{
name: "Bob",
children: [{ name: "Mike" }, { name: "Sarah" }]
},
{
name: "Jim",
children: [{ name: "Eve" }, { name: "Kenny" }, { name: "Brook" }]
}
];
dataSource: MatTableDataSource;
ngOnInit() {
// 关键:扁平化映射 —— 每个 child 生成一条记录,并携带 parent.name
const flattenedRows = this.parents.flatMap(parent =>
parent.children.map(child => ({
childName: child.name,
parentName: parent.name
}))
);
this.dataSource = new MatTableDataSource(flattenedRows);
}
}
<!-- component.html -->
<mat-table class="mat-elevation-z8"><!-- Child Name Column --><ng-container matcolumndef="childName"><mat-header-cell>Child Name</mat-header-cell><mat-cell row>{{ row.childName }}</mat-cell></ng-container><!-- Parent Name Column --><ng-container matcolumndef="parentName"><mat-header-cell>Parent Name</mat-header-cell><mat-cell row>{{ row.parentName }}</mat-cell></ng-container><mat-header-row></mat-header-row><mat-row row columns: displayedcolumns></mat-row></mat-table>
违反 HTML 表格规范(
必须是 或 的直接子元素);
→ /
→
→
结构,手动插入
会导致渲染异常或被浏览器剥离;











