1、参考数据 [ { id: 1, label: '一级 1', children: [ { id: 4, label: '二级 1-1', children: [ { id: 9, label: '三级 1-1-1', }, { id: 10, label: '三级 1-1-2', }, ], }, ], }, { id: 2, label: '一级 2', children: [ { id: 5, label: '二级 2-1', }, { id: 6, label: '二级 2-2', }, ], }, { id: 3, label: '一级 3', children: [ { id: 7, label: '二级 3-1', }, { id: 8, label: '二级 3-2', children: [ { id: 11, label: '三级 3-2-1', }, { id: 12, label: '三级 3-2-2', }, { id: 13, label: '三级 3-2-3', }, ], }, ], }, ]
2、递归函数 function_recursive(data, target_id) { /** * 说明: * -data:传入的data需为数据且不能为空 * -target_id:目标数据的id或其他内容,但必须为该条数据的唯一标识 * -target_data:固定返回一个Object对象 */ let target_data = {} if (!Array.isArray(data) || !data.length) { alert('传入的数据格式需为数组且不能为空...') return target_data } // 递归过程 let get_target_data = item => { if (item.id == target_id) { target_data = item } else { if (item.children && item.children.length) { for (let i = 0; i < item.children.length; i++) { if (Object.keys(target_data).length) break // 如果已经找到了目标数据,记得break get_target_data(item.children[i]) } } } } // for循环传入的data数据并开始递归 for (let i = 0; i < data.length; i++) { if (Object.keys(target_data).length) break // 同上 get_target_data(data[i]) } return target_data },
3、调用 test() { console.time('run-time') let a = this.function_recursive(this.tree_data, this.id) console.timeEnd('run-time') console.log(a) // 目标数据 },