1、模拟后端返回的数据结构
var datas = [ { name: '菜单1', role: ['超级管理员', '管理员', '普通用户'], id: 1000, children: [ { name: '菜单1-1', role: ['管理员', '普通用户'], id: 1001, pid: 1000, children: [ { name: '菜单1-1-1', role: ['管理员'], id: 1001001, pid: 1001 }, { name: '菜单1-1-2', role: ['超级管理员', '管理员', '普通用户'], id: 1001002, pid: 1001 } ] }, { name: '菜单1-2', role: ['超级管理员', '普通用户'], id: 1002, pid: 1000 } ] }, { name: '菜单2', role: ['超级管理员', '管理员', '普通用户'], id: 2000, children: [ { name: '菜单2-1', role: ['超级管理员', '普通用户'], id: 2001, pid: 2000 }, { name: '菜单2-2', role: ['超级管理员', '管理员', '普通用户'], id: 2002, pid: 2000, children: [ { name: '菜单2-2-1', role: ['超级管理员', '普通用户'], id: 2002001, pid: 2002 }, { name: '菜单2-2-2', role: ['超级管理员'], id: 2002002, pid: 2002 } ] } ] } ]
2、通过递归将所有满足条件的数组项提取出来放入一个数组中
var newArr = []function getName(datas) { for (var i in datas) { datas[i].role.forEach((item) => { if (item === '普通用户') { newArr.push(datas[i]) if (datas[i].children) { getName(datas[i].children) } } }) }}getName(datas)
3、再通过递归将新的数组组合成树形结构
function filterArray(data, pid) { var tree = [] var temp for (var i = 0; i < data.length; i++) { if (data[i].pid == pid) { var obj = data[i] temp = filterArray(data, data[i].id) if (temp.length > 0) { obj.children = temp } tree.push(obj) } } return tree}console.log(filterArray(newArr))