题目:在复杂数组中寻找一个值

8 篇文章 0 订阅
1 篇文章 0 订阅

有这样一个数组,它的每个数组项都包含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,所以这里我要用递归来做

  1. 遍历数组,首先判断当前项是否是要寻找的值
  2. 若当前项不是要寻找的值,则判断是否有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,后代再用的函数遍历
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值