var arr = [ { id: 1, parentId: 0, name: '四川' }, { id: 2, parentId: 0, name: '贵州' }, { id: 3, parentId: 0, name: '云南' }, { id: 4, parentId: 0, name: '江苏' }, { id: 5, parentId: 1, name: '成都' }, { id: 6, parentId: 2, name: '贵州' }, { id: 7, parentId: 3, name: '昆明' }, { id: 8, parentId: 4, name: '苏州' }, { id: 9, parentId: 5, name: '成都县1' }, { id: 10, parentId: 5, name: '成都县2' }, { id: 11, parentId: 5, name: '成都县3' }, { id: 12, parentId: 5, name: '成都县4' }, { id: 13, parentId: 5, name: '成都县5' }, { id: 14, parentId: 6, name: '贵州县1' }, { id: 15, parentId: 6, name: '贵州县2' }, { id: 16, parentId: 6, name: '贵州县3' }, { id: 17, parentId: 7, name: '昆明县1' }, { id: 18, parentId: 7, name: '昆明县2' }, { id: 19, parentId: 7, name: '昆明县3' }, { id: 20, parentId: 8, name: '苏州县1' }, { id: 21, parentId: 8, name: '苏州县2' }, { id: 22, parentId: 8, name: '苏州县3' }, { id: 23, parentId: 8, name: '苏州县4' }, { id: 24, parentId: 9, name: '成都镇1' }, { id: 25, parentId: 10, name: '成都镇2' }, { id: 26, parentId: 24, name: '成都村11' }, { id: 27, parentId: 24, name: '成都村12' }, { id: 28, parentId: 24, name: '成都村13' } ] function main(arr, pid = 0, level = 0) { var temp = []; for (var item of arr) { if (item.parentId === pid) { // item.level = level + 1; item.children = main(arr, item.id, item.level); temp.push(item); } } return temp; } var res = main(arr, pid = 0); console.log(JSON.stringify(res)) // for (var item of res) { // var result = findId(item, 28) // console.log('res', result) // } function findId(item, id) { var isFind = false; if (Array.isArray(item)) { for (var tree of item) { if (tree.id == id) { isFind = true; var result = Object.assign({}, tree); delete result.children; return result; } else { if (tree.children.length > 0) { return findId(tree.children, id); } } } if (!isFind) return 'not exists'; } else { if (item.id == id) { var result = Object.assign({}, item); delete result.children; return result; } else { return findId(item.children, id); } } } var data = findParentInTree(res, '28', '3', 'id', 'parentId') console.log('data', data) function findParentInTree(trees, id, zIndex, indexId, parentId) { var ids = []; var pids = []; function findId(trees, id) { trees.map(tree => { if (tree[indexId] == id) { var result = Object.assign({}, tree); delete result.children; ids.push(result) return result; } else { if (tree.children.length > 0) { return findId(tree.children, id); } } }) } function findPid(trees, idInfo) { var pid = idInfo[parentId]; trees.map(tree => { if (tree[indexId] == pid) { var result = Object.assign({}, tree); delete result.children; pids.push(result) return result; } else { if (tree.children.length > 0) { return findPid(tree.children, idInfo); } } }) } findId(res, id); if (ids.length !== 1) { return {}; } if (zIndex == 0) { return ids[0]; } else if (zIndex < 0) { return {}; } else { for (var k = 1; k <= zIndex; k++) { var Info = Object.assign({}, k == 1 ? ids[0] : pids[0]); ids = []; pids = []; findPid(trees, Info); } if (pids.length !== 1) { return {}; } return pids[0] } }
结果
[{ "id": 1, "parentId": 0, "name": "四川", "children": [{ "id": 5, "parentId": 1, "name": "成都", "children": [{ "id": 9, "parentId": 5, "name": "成都县1", "children": [{ "id": 24, "parentId": 9, "name": "成都镇1", "children": [{ "id": 26, "parentId": 24, "name": "成都村11", "children": [] }, { "id": 27, "parentId": 24, "name": "成都村12", "children": [] }, { "id": 28, "parentId": 24, "name": "成都村13", "children": [] }] }] }, { "id": 10, "parentId": 5, "name": "成都县2", "children": [{ "id": 25, "parentId": 10, "name": "成都镇2", "children": [] }] }, { "id": 11, "parentId": 5, "name": "成都县3", "children": [] }, { "id": 12, "parentId": 5, "name": "成都县4", "children": [] }, { "id": 13, "parentId": 5, "name": "成都县5", "children": [] }] }] }, { "id": 2, "parentId": 0, "name": "贵州", "children": [{ "id": 6, "parentId": 2, "name": "贵州", "children": [{ "id": 14, "parentId": 6, "name": "贵州县1", "children": [] }, { "id": 15, "parentId": 6, "name": "贵州县2", "children": [] }, { "id": 16, "parentId": 6, "name": "贵州县3", "children": [] }] }] }, { "id": 3, "parentId": 0, "name": "云南", "children": [{ "id": 7, "parentId": 3, "name": "昆明", "children": [{ "id": 17, "parentId": 7, "name": "昆明县1", "children": [] }, { "id": 18, "parentId": 7, "name": "昆明县2", "children": [] }, { "id": 19, "parentId": 7, "name": "昆明县3", "children": [] }] }] }, { "id": 4, "parentId": 0, "name": "江苏", "children": [{ "id": 8, "parentId": 4, "name": "苏州", "children": [{ "id": 20, "parentId": 8, "name": "苏州县1", "children": [] }, { "id": 21, "parentId": 8, "name": "苏州县2", "children": [] }, { "id": 22, "parentId": 8, "name": "苏州县3", "children": [] }, { "id": 23, "parentId": 8, "name": "苏州县4", "children": [] }] }] }]
{ id: 5, parentId: 1, name: '成都' }