数组转树形
let arr = [{
id: 1,
label: ‘1’,
parentId: -1,
}, {
id: 2,
label: ‘2’,
parentId: -1,
}, {
id: 3,
label: ‘1-1’,
parentId: 1,
}, {
id: 4,
label: ‘1-2’,
parentId: 1,
}, {
id: 5,
label: ‘2-1’,
parentId: 2,
}, {
id: 6,
label: ‘1-1-1’,
parentId: 3,
}, ]
function Tree(arr, id_k, parent_k, isRoot) {
if (!!!arr) return tree
let tree = [],
idObj = {}
arr.forEach(item => idObj[item[id_k]] = item)
Object.values(idObj).forEach(item => {
let parent = idObj[item[parent_k]]
if (!isRoot(item)) {
!!!parent.children && (parent.children = [])
let children = parent.children;
!children.includes(item) && children.push(item)
} else {
tree = [...tree, item]
}
})
return tree
}
const tree = Tree(arr, 'id', 'parentId', item => item.parentId === -1)
console.log(tree)
数组转树形
function untieTree(arr, children_k = 'children') {
if (!!!arr || Object.prototype.toString.call(arr) !== '[object Array]' || arr.length === 0) return [];
let tree = []
arr.forEach(item => {
tree.push(item, ...untieTree(item[children_k]))
})
return tree
}
console.log(untieTree(tree))