js数组转成tree
时间: 2023-08-11 13:07:41 浏览: 109
将一个扁平的数组转换为树形结构可以使用递归算法。假设每个节点包含一个唯一的 `id`,以及指向其父节点的 `parentId`,则可以按照以下方式实现:
```javascript
function arrayToTree(items) {
const result = []; // 存储根节点
const itemMap = {}; // 用于快速查找每个节点
// 将每个节点存储在itemMap中,并将其子节点初始化为空数组
for (const item of items) {
const id = item.id;
const parentId = item.parentId;
if (!itemMap[id]) {
itemMap[id] = {
children: []
};
}
itemMap[id] = {
...item,
children: itemMap[id]['children']
};
const treeItem = itemMap[id];
if (!parentId) {
result.push(treeItem); // 如果没有父节点,则将其作为根节点添加到结果中
} else {
if (!itemMap[parentId]) {
itemMap[parentId] = {
children: []
};
}
itemMap[parentId].children.push(treeItem); // 否则,将其添加到父节点的子节点列表中
}
}
return result;
}
```
这个函数接受一个扁平的数组作为输入,并返回一个树形结构数组。每个节点都是一个对象,包含 `id`、`parentId` 和 `children` 属性。如果一个节点没有父节点,则将其作为根节点添加到结果数组中。
例如,假设有以下输入数组:
```javascript
const items = [
{ id: 1, parentId: null, name: 'John' },
{ id: 2, parentId: 1, name: 'Bob' },
{ id: 3, parentId: 1, name: 'Sue' },
{ id: 4, parentId: 2, name: 'Dan' },
{ id: 5, parentId: 2, name: 'Joe' },
{ id: 6, parentId: 3, name: 'Moe' },
{ id: 7, parentId: 3, name: 'Mary' }
];
```
那么返回的树形结构数组将如下所示:
```javascript
[
{
"id": 1,
"parentId": null,
"name": "John",
"children": [
{
"id": 2,
"parentId": 1,
"name": "Bob",
"children": [
{
"id": 4,
"parentId": 2,
"name": "Dan",
"children": []
},
{
"id": 5,
"parentId": 2,
"name": "Joe",
"children": []
}
]
},
{
"id": 3,
"parentId": 1,
"name": "Sue",
"children": [
{
"id": 6,
"parentId": 3,
"name": "Moe",
"children": []
},
{
"id": 7,
"parentId": 3,
"name": "Mary",
"children": []
}
]
}
]
}
]
```
阅读全文