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) // 目标数据
},