const data = [ { id: 1, pid: 0, name: "一级菜单A" }, { id: 2, pid: 0, name: "一级菜单B" }, { id: 3, pid: 0, name: "一级菜单C" }, { id: 4, pid: 1, name: "二级菜单A-A" }, { id: 5, pid: 1, name: "二级菜单A-B" }, { id: 6, pid: 2, name: "二级菜单B-A" }, { id: 7, pid: 4, name: "三级菜单A-A-A" }, { id: 8, pid: 7, name: "四级菜单A-A-A-A" }, { id: 9, pid: 8, name: "五级菜单A-A-A-A-A" }, ]; function toTree(data) { return data.filter((father) => { const children = data.filter((child) => child.pid === father.id); father.children = children.length > 0 ? children : []; return father.pid === 0; }); } console.log("**", toTree(data)); function toArray(tree) { let out = []; let clone = [].concat(tree); while (clone.length) { let first = clone.shift(); if (first.children) { clone = clone.concat(first.children); delete first["children"]; } out.push(first); } return out; }