最近遇到一个需求,使用ele-tree组件,需要默认选中第一个子节点。
数据结构如下,需要找到第一个isLeaf == true的叶子节点对象,此处即闸站21
const test = [
{
name: '泵站',
id: 'bengzhan',
isLeaf: false,
children: []
},
{
name: '泵站',
id: 'bengzhan',
isLeaf: false,
children: []
},
{
name: '闸站',
id: 'zhazhan',
isLeaf: false,
children: [
{
ame: '闸站1',
id: 'zhazhan1',
isLeaf: false,
children: []
},
{
name: '闸站2',
id: 'zhazhan2',
isLeaf: false,
children: [
{
name: '闸站21',
id: 'zhazhan21',
isLeaf: true,
children: []
},
{
name: '闸站22',
id: 'zhazhan22',
isLeaf: true,
children: []
},
]
},
{
name: '闸站3',
id: 'zhazhan3',
isLeaf: false,
children: [
{
name: '闸站31',
id: 'zhazhan31',
isLeaf: true,
children: []
},
{
name: '闸站32',
id: 'zhazhan32',
isLeaf: true,
children: []
},
]
},
]
},
]
代码如下:
let res = {};
function getFirstChild(val) {
if (JSON.stringify(res) != "{}") {
return;//如果res不再是空对象,退出递归
} else {
//遍历数组
for (let i = 0; i < val.length; i++) {
//如果当前的isleaf是true,说明是叶子节点,把当前对象赋值给res,并return,终止循环
if (val[i].isLeaf) {
res = val[i];
return;
} else if (!val[i].children) {//如果chidren为空,则停止这次循环
break;
} else {//否则的话,递归当前节点的children
getFirstChild(val[i].children);
}
}
}
}
for循环加上递归,如果满足条件,则退出递归和循环。注意,每次执行前都要判断res是不是还是空对象,是的话直接return退出递归,否则得到的结果会是闸站31,即遍历完所有节点符合条件的倒数第二个。