关于递归处理,应该怎么处理,思路是什么?

简介: 本文讨论了如何使用递归处理将嵌套对象中的所有名称(name)属性转换为标签(label)属性的问题,提供了详细的递归函数实现思路和代码示例。

在这里插入图片描述
其实问题很简单,就是想要循环遍历整个data对象,来实现所有name转成label,但是想到里面还有children属性,整个children里面可能还会嵌套很多很多的name,如此循环,很难搞,知道使用递归,但却无从下手。

let data = {
   
    name: 'a', 
    children: [
        {
    name: 'b', children: null },
        {
    name: 'c', 
          children: [
            {
    name: 'd', children: null },
            {
    name: 'e', 
               children: [{
    name: 'f', children: null }] 
             }
          ]
        }
    ]
}

这里面的结构可能还会有更多的嵌套,首先递归的思路是对的,我们要找一个临界条件来终止整个递归,有一个条件才让他递归。
首先递归肯定是要循环的。
我们可以去循环data整个对象,也可以按照children数组的形式去循环
我喜欢喜欢数组,其实大同小异。

const aaa = (data) => {
   
    Array.isArray(data) ? data = data : data = [data]
    return data.map(item => {
   
        item['label'] = item.name
        if (item.children && item.children.length !== 0) {
   
            aaa(item.children)
        }
        return item
    })
}

我们使用map循环,map的话可能返回一个新的数组,是符合我们递归的需求,不需要新建立一个变量来存储改变之后的数组对象。
这个问题的临界点就是,children是否存在子级,那我们就可以这样判断找到临界

item.children && item.children.length !== 0

只有children存在并且他里面的水族项是有值的才能让他递归,否则不参与递归,直接返回。
递归的话,直接再一次

aaa(item.children)

进入递归条件。这个时候操作的都是item.children里的数组对象,当然这里面也有用带复杂数据类型引用关系的特点。
在这里插入图片描述
这样成功了,我们也可以吧name属性删除

delete item.name

在这里插入图片描述

目录
相关文章
|
3月前
|
存储 算法 数据挖掘
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
【模拟面试问答】力扣165题:比较版本号(逐个比较与双指针法详解及模拟面试问答)
|
算法
代码随想录 Day30 - 回溯(六)
代码随想录 Day30 - 回溯(六)
52 1
|
算法
第 10 天_递归 / 回溯【算法入门】
第 10 天_递归 / 回溯【算法入门】
97 0
|
算法
第 11 天_递归 / 回溯【算法入门】
第 11 天_递归 / 回溯【算法入门】
113 0
代码随想录 Day28 - 回溯(四)
代码随想录 Day28 - 回溯(四)
30 0
代码随想录 Day27 - 回溯(三)
代码随想录 Day27 - 回溯(三)
33 0
代码随想录 Day29 - 回溯(五)
代码随想录 Day29 - 回溯(五)
32 0
|
存储
代码随想录 Day25 - 回溯(二)
代码随想录 Day25 - 回溯(二)
31 0
|
算法
回溯到底怎么用?
回溯到底怎么用?
154 0
|
算法
算法刷题第十一天:递归 / 回溯--2
算法刷题第十一天:递归 / 回溯--2
54 0
算法刷题第十一天:递归 / 回溯--2