笔试代码题
构造树形结构
前端使用树形结构的数据很常见,比如展示层级的Tree 树形控件.
;[
{
id: 1,
name: 'Item 1',
parentId: 8,
children: [
{
id: 2,
name: 'Item 1.1',
parentId: 1,
children: [],
},
],
},
]
但是有时候给我们的数据是这样的,需要我们将数据处理成树形结构那样.
;[
{ id: 6, name: 'Item 2.2', parentId: 1 },
{ id: 1, name: 'Item 1', parentId: 8 },
{ id: 2, name: 'Item 1.1', parentId: 1 },
]
这里使用了Map来记录每一项数据 id 与之对应的关系,默认给每一项加入了 children 属性,用于存储子节点.
遍历源数据拿到每一项的 id 与 parentId,根据 parentId 找到对应的父节点,然后将当前节点添加到父节点的 children 属性中.这里将没有对应父节点的节点添加到根节点上,可以根据具体的业务逻辑修改.
function buildTree(flatArray, idKey = 'id', parentIdKey = 'parentId') {
const itemMap = new Map()
const tree = []
flatArray.forEach((item) => {
const { [idKey]: id } = item
const node = { ...item, children: [] }
itemMap.set(id, node)
})
flatArray.forEach(({ [idKey]: id, [parentIdKey]: parentId }) => {
const currentNode = itemMap.get(id)
const parentNode = itemMap.get(parentId)
parentNode ? parentNode.children.push(currentNode) : tree.push(currentNode)
})
return tree
}