有这样一个数组,它的每个数组项都包含children属性,children也是一个结构一模一样的数组
let arr = [
{
name: 'zzh',
key: '1',
children: [
{
name: 'aaa',
key: '1-1',
children: []
},
{
name: 'bbb',
key: '1-2',
children: []
},
{
name: 'ccc',
key: '1-3',
children: []
}
]
},
{
name: 'yh',
key: '2',
children: [
{
name: 'qqq',
key: '2-1',
children: [
{
name:'fff',
key:'2-1-1',
children:[]
}
]
},
{
name: 'www',
key: '2-2',
children: []
},
{
name: 'eee',
key: '2-3',
children: []
}
]
}
]
我要在此数组中通过name寻找一个值,并将它的key保存,如何实现?
首先这个数组的层级不确定,children可能一直有children,所以这里我要用递归来做
- 遍历数组,首先判断当前项是否是要寻找的值
- 若当前项不是要寻找的值,则判断是否有children,有children则递归调用
function test (arr, name) {
for (let item of arr) {
//首先判断是否有值存在,有则return打断循环
if (item.name === name) {
return item.key
}
//当上面判断不成立时,判断它有没有children,有则调用test去children中寻找
if(item.children && item.children.length){
let i = test(item.children,name) //这里很重要,保存children寻找的结果,如果children找到则返回出去
if(i){
return i
}
}
}
return null
}
console.log(test(arr, 'fff'))
为了减少循环,只要有符合条件的值就会打断遍历,所以上面的只会寻找第一个出现的值,如果要找到每个值则用for或forEach
2.现在要寻找一个值,并且返回这个值的层级结构,比如要寻找name为fff,它的层级结构为:“2”,“2-1”,“2-1-1”。
当然我们这里的key很有规律,知道值的key就能推断它的父级。假设不能通过此规律寻找,如何来寻找层级结构?
刚开始的时候一直不知道怎么做,想到的方法是遍历每个元素,然后通过上面的函数判断后代是否存在,但是这样不就又多遍历了一次吗,其实上面的函数已经遍历了数组,我们可以直接根据上面的函数判断,并保存值即可
let result = []
function test (arr, name,result) {
for (let item of arr) {
//首先判断是否有值存在,有则return打断循环
if (item.name === name) {
return item.key
}
//当上面判断不成立时,判断它有没有children,有则调用test去children中寻找
if(item.children && item.children.length){
let i = test(item.children,name,result) //这里很重要,保存children寻找的结果,如果children找到则返回出去
if(i){
result.push(item.key)
return i
}
}
}
return null
}
test(arr,'fff',result)
console.log(333,result)
上面的弊端就是顺序是相反的,因为只有遍历到最后才知道后代是否存在
这是我在工作中遇到的一个问题:
当我搜索一个值时,自动展开,这样对搜索的值一目了然,上面是用antd的Table组件做的,要展开每一级就需要设置展开的keys,所以我需要层级结构,我使用的是id作为key,所以也不存在上面的那种直接获得层级的规律。搜索值在一级层级之间可以重复,1一级以下不重复,所以一级用forEach,后代再用的函数遍历