扁平化数组转换成tree array
扁平化数组转换成tree array
扁平化数组转换成tree array
在 JavaScript 中,将扁平化数组转换为树形数组(Tree Array)是一个常见的需求,通常用于处理具有层级关系的数据,例如组织结构、文件目录等。以下是实现这一功能的步骤和代码示例。
数据结构说明
假设我们有一个扁平化的数组,每个对象包含以下字段:
id:唯一标识符。parentId:父级的id,如果没有父级,则为null或特定值。- 其他字段(如
name、children等)。
目标是将这个扁平化数组转换为一个树形结构,其中每个节点包含一个children数组,用于存储子节点。
实现步骤
- 创建一个映射表:将每个节点的
id映射到其对应的对象,便于快速查找。 - 构建树形结构:遍历每个节点,根据其
parentId将其添加到父节点的children数组中。 - 提取根节点:所有没有父节点(
parentId为null或特定值)的节点作为树的根节点。
示例代码
以下是一个完整的实现示例:
输入数据
1 | const flatArray = [ |
转换代码
1 | function flatArrayToTree(flatArray) { |
输出结果
1 | [ |
代码解析
- 映射表的创建:
1
const map = new Map(flatArray.map(item => [item.id, { ...item, children: [] }]));
- 使用
Map创建一个映射表,将每个节点的id映射到其对应的对象,并初始化children数组。
- 使用
- 遍历数组并构建树形结构:
1
2
3
4
5
6
7
8
9
10
11for (const item of flatArray) {
const node = map.get(item.id); // 获取当前节点
if (item.parentId === null) {
tree.push(node); // 如果没有父节点,则为根节点
} else {
const parentNode = map.get(item.parentId); // 获取父节点
if (parentNode) {
parentNode.children.push(node); // 将当前节点添加到父节点的 children 数组中
}
}
}- 遍历扁平化数组,根据
parentId判断当前节点是否为根节点。 - 如果是根节点,直接加入
tree数组。 - 如果不是根节点,找到其父节点,并将当前节点加入父节点的
children数组。
- 遍历扁平化数组,根据
- 返回树形结构:
1
return tree;
- 最终返回构建好的树形数组。
注意事项
- 数据完整性:
- 确保每个节点的
parentId是有效的,否则可能会导致某些节点无法正确加入树形结构。 - 如果数据中存在无效的
parentId,可以在代码中添加额外的检查逻辑。
- 确保每个节点的
- 性能优化:
- 使用
Map来存储节点,可以快速通过id查找节点,避免了多次遍历数组,提高了性能。
- 使用
- 扩展性:
- 如果需要支持更复杂的层级关系(如多级嵌套),当前的实现已经足够支持。只需要确保数据结构正确即可。
通过上述方法,可以将扁平化数组高效地转换为树形数组,适用于各种需要层级结构的场景。
- 如果需要支持更复杂的层级关系(如多级嵌套),当前的实现已经足够支持。只需要确保数据结构正确即可。