要将提供的数组重组成具有 children
的级联形式,并确保没有空的 children
属性,我们可以按照以下步骤来实现:
- 为每个项目按照
/
分割其name
属性,以确定其层级结构。 - 使用一个对象来维护已经创建的节点,以便于构建层级关系。
- 遍历数组,为每个项目创建节点,并根据其层级路径挂载到父节点的
children
中。 - 过滤掉那些没有子节点的
children
属性。
以下是实现这一逻辑的 JavaScript 代码示例:
const items = [
{ name: 'folder1' },
{ name: 'folder1/folder2' },
{ name: 'folder1/folder2/file.txt' },
{ name: 'folder2' },
];
function createCascade(items) {
const nodeMap = {};
// 创建节点并建立映射
items.forEach(item => {
const parts = item.name.split('/').filter(part => part !== ''); // 防止出现空字符串
let currentNode = nodeMap;
parts.forEach((part, index) => {
const newNode = currentNode[part] || { name: part, children: [] };
currentNode[part] = newNode;
if (index === parts.length - 1) {
newNode.children = []; // 确保最底层没有 children 属性
}
currentNode = newNode;
});
});
// 转换映射为级联结构
const cascade = Object.values(nodeMap).filter(node => !!node.children || node.name === 'folder2');
return cascade; // 返回级联结构
}
const cascadeTree = createCascade(items);
console.log(cascadeTree);
这个脚本首先创建了一个映射,用于存储每个节点及其子节点。然后,它遍历原始数组,为每个项目创建一个层级结构。最后,它将映射转换为一个数组,其中仅包含具有子节点的节点,并且过滤掉空的 children
属性。
输出结果将是一个具有嵌套 children
属性的数组,不包含空的 children
数组:
[
{
"name": "folder1",
"children": [
{
"name": "folder2",
"children": [
{
"name": "file.txt"
}
]
}
]
},
{
"name": "folder2"
}
]
请注意,由于 ‘folder2’ 没有父级指向它作为子级,它将作为独立的顶级节点存在。如果 ‘folder2’ 应该作为 ‘folder1’ 的子级,但原始数据中缺少 ‘folder1/folder2’ 的条目,你需要根据实际情况调整输入数据或重组逻辑。