原生js vue react通用的递归函数

简介: 原生js vue react通用的递归函数

1.递归函数的由来

       递归函数的由来可以追溯到数学中的递归概念和数学归纳法。

       在数学中,递归是指通过定义基本情况和递推公式,将一个问题分解为更简单的、与原问题具有相同结构的子问题,并用子问题的解来构建原问题的解。递归的思想在解决一些数学问题时非常有用。

       当计算机科学发展起来后,人们将递归思想应用到程序设计中,形成了递归函数的概念。递归函数是一种能够调用自身的函数。 递归函数的使用可以有效地解决一些需要重复执行相似任务或处理具有递归结构的问题。

递归函数的设计通常包括两部分:

  1. 基本情况(边界条件):定义问题的最简单情况和对应的解,作为递归的终止条件。
  2. 递推公式(递归关系):描述问题和子问题之间的联系,通过递归调用函数本身来解决规模较小的子问题。

        递归函数的执行过程中,每次调用都会创建一个新的函数上下文(包括参数、局部变量等),并将其压入执行栈。递归函数通过不断调用自身,并处理更小规模的子问题,直到达到基本情况为止,然后逐步返回结果,并依次弹出执行栈中的上下文,完成整个递归过程。

递归函数在实际编程中有广泛的应用,例如树的遍历、图的搜索、排列组合、动态规划等领域。但需要注意的是,递归函数的设计要合理,避免无限递归或重复计算,以确保程序的正确性和效率。

2.代码逻辑

假设下方的数据是我们从接口中获取到的

1. 
2. 
3.      var temp = [
4.      {
5.        "id": 1,
6.        "pid": 0,
7.        "title": "一档",
8.        "money": "666.00"
9.      },
10.       {
11.         "id": 2,
12.         "pid": 0,
13.         "title": "二档",
14.         "money": "1900.00"
15.       },
16.       {
17.         "id": 3,
18.         "pid": 1,
19.         "title": "一档1级",
20.         "money": "1800.00"
21.       },
22.       {
23.         "id": 4,
24.         "pid": 0,
25.         "title": "三档",
26.         "money": "2000.00"
27.       },
28.       {
29.         "id": 5,
30.         "pid": 0,
31.         "title": "四档",
32.         "money": "2200.00"
33.       },
34.       {
35.         "id": 6,
36.         "pid": 5,
37.         "title": "四档1级",
38.         "money": "2200.00"
39.       },
40.       {
41.         "id": 7,
42.         "pid": 2,
43.         "title": "二档1级",
44.         "money": "3700.00"
45.       },
46.       {
47.         "id": 8,
48.         "pid": 4,
49.         "title": "三档1级",
50.         "money": "2000.00"
51.       },
52.       {
53.         "id": 10,
54.         "pid": 0,
55.         "title": "五档",
56.         "money": "250.00"
57.       },
58.       {
59.         "id": 12,
60.         "pid": 10,
61.         "title": "五档1级",
62.         "money": "10000.00"
63.       },
64.       {
65.         "id": 18,
66.         "pid": 1,
67.         "title": "一档2级",
68.         "money": "1800.00"
69.       },
70.       {
71.         "id": 21,
72.         "pid": 0,
73.         "title": "六档",
74.         "money": "0.00"
75.       },
76.       {
77.         "id": 24,
78.         "pid": 1,
79.         "title": "一档3级",
80.         "money": "1800.00"
81.       },
82.       {
83.         "id": 25,
84.         "pid": 2,
85.         "title": "二档2级",
86.         "money": "4100.00"
87.       },
88.       {
89.         "id": 26,
90.         "pid": 2,
91.         "title": "二档3级",
92.         "money": "4400.00"
93.       },
94.       {
95.         "id": 27,
96.         "pid": 4,
97.         "title": "三档2级",
98.         "money": "2000.00"
99.       },
100.      {
101.        "id": 28,
102.        "pid": 4,
103.        "title": "三档3级",
104.        "money": "2000.00"
105.      },
106.      {
107.        "id": 29,
108.        "pid": 5,
109.        "title": "四档2级",
110.        "money": "2200.00"
111.      },
112.      {
113.        "id": 30,
114.        "pid": 5,
115.        "title": "四档3级",
116.        "money": "2200.00"
117.      },
118.      {
119.        "id": 31,
120.        "pid": 2,
121.        "title": "1",
122.        "money": "4100.00"
123.      },
124.      {
125.        "id": 32,
126.        "pid": 2,
127.        "title": "3",
128.        "money": "4400.00"
129.      },
130.      {
131.        "id": 38,
132.        "pid": 0,
133.        "title": "八档",
134.        "money": "0.00"
135.      },
136.      {
137.        "id": 39,
138.        "pid": 10,
139.        "title": "轻微",
140.        "money": "100000000.00"
141.      },
142.      {
143.        "id": 44,
144.        "pid": 42,
145.        "title": "一级",
146.        "money": "12323.00"
147.      },
148.      {
149.        "id": 45,
150.        "pid": 42,
151.        "title": "二级",
152.        "money": "755.00"
153.      },
154.      {
155.        "id": 47,
156.        "pid": 42,
157.        "title": "三级",
158.        "money": "44444.00"
159.      },
160.      {
161.        "id": 49,
162.        "pid": 48,
163.        "title": "一级",
164.        "money": "21234.00"
165.      },
166.      {
167.        "id": 50,
168.        "pid": 42,
169.        "title": "三级",
170.        "money": "44444.00"
171.      },
172.      {
173.        "id": 52,
174.        "pid": 48,
175.        "title": "一级",
176.        "money": "21234.00"
177.      },
178.      {
179.        "id": 57,
180.        "pid": 53,
181.        "title": "一级",
182.        "money": "4332.00"
183.      },
184.      {
185.        "id": 61,
186.        "pid": 38,
187.        "title": "啊",
188.        "money": "50.00"
189.      },
190.      {
191.        "id": 62,
192.        "pid": 1,
193.        "title": "1231",
194.        "money": "1.00"
195.      },
196.      {
197.        "id": 63,
198.        "pid": 0,
199.        "title": "阿斯顿飞过",
200.        "money": "0.00"
201.      },
202.      {
203.        "id": 66,
204.        "pid": 1,
205.        "title": "1",
206.        "money": "23.00"
207.      },
208.      {
209.        "id": 67,
210.        "pid": 2,
211.        "title": "123",
212.        "money": "123.00"
213.      },
214.      {
215.        "id": 70,
216.        "pid": 2,
217.        "title": "123",
218.        "money": "123.00"
219.      },
220.      {
221.        "id": 71,
222.        "pid": 38,
223.        "title": "桀桀桀",
224.        "money": "0.00"
225.      },
226.      {
227.        "id": 72,
228.        "pid": 12,
229.        "title": "11",
230.        "money": "11.00"
231.      },
232.      {
233.        "id": 73,
234.        "pid": 12,
235.        "title": "11",
236.        "money": "11.00"
237.      },
238.      {
239.        "id": 77,
240.        "pid": 1,
241.        "title": "测试一下",
242.        "money": "10000000.00"
243.      },
244.      {
245.        "id": 78,
246.        "pid": 1,
247.        "title": "七龙珠1",
248.        "money": "999.00"
249.      },
250.      {
251.        "id": 79,
252.        "pid": 2,
253.        "title": "测试",
254.        "money": "100.00"
255.      },
256.      {
257.        "id": 80,
258.        "pid": 1,
259.        "title": "测试一下",
260.        "money": "10000000.00"
261.      },
262.      {
263.        "id": 81,
264.        "pid": 0,
265.        "title": "我编辑了一下",
266.        "money": "123123.00"
267.      },
268.      {
269.        "id": 94,
270.        "pid": 81,
271.        "title": "我添加了一下",
272.        "money": "4567.00"
273.      },
274.      {
275.        "id": 97,
276.        "pid": 96,
277.        "title": "测试",
278.        "money": "0.00"
279.      },
280.      {
281.        "id": 101,
282.        "pid": 100,
283.        "title": "神奇",
284.        "money": "1.00"
285.      },
286.      {
287.        "id": 102,
288.        "pid": 101,
289.        "title": "神奇_yi",
290.        "money": "1.00"
291.      },
292.      {
293.        "id": 103,
294.        "pid": 102,
295.        "title": "神奇_er",
296.        "money": "1.00"
297.      },
298.      {
299.        "id": 104,
300.        "pid": 96,
301.        "title": "测试",
302.        "money": "0.00"
303.      },
304.      {
305.        "id": 109,
306.        "pid": 105,
307.        "title": "测试",
308.        "money": "1.00"
309.      },
310.      {
311.        "id": 111,
312.        "pid": 103,
313.        "title": "1",
314.        "money": "1.00"
315.      },
316.      {
317.        "id": 112,
318.        "pid": 111,
319.        "title": "11",
320.        "money": "11.00"
321.      },
322.      {
323.        "id": 113,
324.        "pid": 112,
325.        "title": "111",
326.        "money": "111.00"
327.      },
328.      {
329.        "id": 114,
330.        "pid": 113,
331.        "title": "1112",
332.        "money": "1112.00"
333.      },
334.      {
335.        "id": 115,
336.        "pid": 114,
337.        "title": "11122",
338.        "money": "11122.00"
339.      },
340.      {
341.        "id": 116,
342.        "pid": 103,
343.        "title": "1",
344.        "money": "1.00"
345.      },
346.      {
347.        "id": 117,
348.        "pid": 4,
349.        "title": "1",
350.        "money": "1.00"
351.      },
352.      {
353.        "id": 118,
354.        "pid": 4,
355.        "title": "1",
356.        "money": "1.00"
357.      },
358.      {
359.        "id": 119,
360.        "pid": 2,
361.        "title": "",
362.        "money": "0.00"
363.      },
364.      {
365.        "id": 120,
366.        "pid": 2,
367.        "title": "",
368.        "money": "0.00"
369.      },
370.      {
371.        "id": 121,
372.        "pid": 4,
373.        "title": "nihao",
374.        "money": "789.00"
375.      },
376.      {
377.        "id": 122,
378.        "pid": 94,
379.        "title": "纳尼?",
380.        "money": "1111.00"
381.      },
382.      {
383.        "id": 123,
384.        "pid": 122,
385.        "title": "测试1",
386.        "money": "1111.00"
387.      },
388.      {
389.        "id": 124,
390.        "pid": 123,
391.        "title": "???",
392.        "money": "1111.00"
393.      },
394.      {
395.        "id": 125,
396.        "pid": 124,
397.        "title": "嗯?",
398.        "money": "1111.00"
399.      },
400.      {
401.        "id": 126,
402.        "pid": 125,
403.        "title": "怎么回事?",
404.        "money": "1111.00"
405.      },
406.      {
407.        "id": 127,
408.        "pid": 94,
409.        "title": "纳尼?",
410.        "money": "1111.00"
411.      },
412.      {
413.        "id": 128,
414.        "pid": 124,
415.        "title": "嗯?",
416.        "money": "1111.00"
417.      },
418.      {
419.        "id": 129,
420.        "pid": 125,
421.        "title": "吆西",
422.        "money": "123.00"
423.      },
424.      {
425.        "id": 130,
426.        "pid": 125,
427.        "title": "吆西",
428.        "money": "123.00"
429.      },
430.      {
431.        "id": 131,
432.        "pid": 130,
433.        "title": "123",
434.        "money": "123.00"
435.      },
436.      {
437.        "id": 132,
438.        "pid": 130,
439.        "title": "123",
440.        "money": "123.00"
441.      }
442.    ]
js逻辑部分

首先将拿到的数据进行处理

1. //处理好的数据
2.     let res = getTree(temp,0,[]);
3.     console.log(res);//打印观察

先获取到所有的以及数据

1. //处理数据方法
2. function getTree(list,pid,data){
3. //获取所有一级
4. for(let item of list){
5. if(item.pid == pid){
6. data.push(item);
7.             }
8.         }
9. return data;
10.     }

获取二级及三级数据

1. //获取子级
2. for(let i of data){
3.             i.children = [];
4.             getTree(list,i.id,i.children);//递归调用
5. if(i.children.length == 0){
6. delete i.children;
7.             }
8.         }

逻辑综合代码

1. //处理好的数据
2.     let res = getTree(temp,0,[]);
3.     console.log(res);//打印观察
4. 
5. //处理数据方法
6. function getTree(list,pid,data){
7. //获取所有一级
8. for(let item of list){
9. if(item.pid == pid){
10. data.push(item);
11.             }
12.         }
13. //获取子级
14. for(let i of data){
15.             i.children = [];
16.             getTree(list,i.id,i.children);//递归调用
17. if(i.children.length == 0){
18. delete i.children;
19.             }
20.         }
21. 
22. return data;
23.     }

效果如下:

本篇博客结束谢谢观看,如有更好的意见请在评论区发出来讨论。


目录
相关文章
|
22天前
|
存储 缓存 JavaScript
如何优化React或Vue应用的性能
需要注意的是,性能优化是一个持续的过程,需要根据具体的应用场景和性能问题进行针对性的优化。同时,不同的项目和团队可能有不同的优化重点和方法,要结合实际情况灵活运用这些优化策略,以达到最佳的性能效果。
105 51
|
1月前
|
JavaScript 前端开发 Java
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
本文介绍了JavaScript中常用的函数和方法,包括通用函数、Global对象函数以及数组相关函数。详细列出了每个函数的参数、返回值及使用说明,并提供了示例代码。文章强调了函数的学习应结合源码和实践,适合JavaScript初学者和进阶开发者参考。
42 2
[JS]同事:这次就算了,下班回去赶紧补补内置函数,再犯肯定被主管骂
|
22天前
|
监控 JavaScript 前端开发
如何在实际应用中测试和比较React和Vue的性能?
总之,通过多种方法的综合运用,可以相对客观地比较 React 和 Vue 在实际应用中的性能表现,为项目的选择和优化提供有力的依据。
31 1
|
23天前
|
JavaScript 前端开发 开发者
React和Vue有什么区别?
React 和 Vue 都有各自的优势和特点,开发者可以根据项目的需求、团队的技术背景以及个人的喜好来选择使用。无论是 React 还是 Vue,它们都在不断发展和完善,为前端开发提供了强大的支持。
45 2
|
23天前
|
JavaScript 前端开发 测试技术
React和Vue的性能对比如何?
需要注意的是,性能不仅仅取决于框架本身,还与开发者的代码质量、架构设计以及项目的优化程度等密切相关。因此,在评估性能时,应该综合考虑多个因素,而不是仅仅局限于框架之间的比较。
95 1
|
29天前
|
JavaScript 前端开发 算法
React 框架和 Vue 框架的区别是什么?
React框架和Vue框架都是目前非常流行的前端JavaScript框架,它们在很多方面存在区别
|
1月前
|
前端开发 JavaScript 开发者
除了 Generator 函数,还有哪些 JavaScript 异步编程解决方案?
【10月更文挑战第30天】开发者可以根据具体的项目情况选择合适的方式来处理异步操作,以实现高效、可读和易于维护的代码。
|
25天前
|
JavaScript 前端开发 开发者
JavaScript框架React vs. Vue:一场性能与易用性的较量
JavaScript框架React vs. Vue:一场性能与易用性的较量
31 0
|
前端开发 JavaScript
用原生javascript实现最简单的发布者-订阅者模式
http://www.cnblogs.com/surahe/p/6065778.html    发布—订阅模式可以广泛应用于异步编程中,这是一种替代传递回调函数的方案。比如,我们可以订阅 ajax 请求的 error 、 succ 等事件。
938 0
|
25天前
|
JavaScript 前端开发
JavaScript中的原型 保姆级文章一文搞懂
本文详细解析了JavaScript中的原型概念,从构造函数、原型对象、`__proto__`属性、`constructor`属性到原型链,层层递进地解释了JavaScript如何通过原型实现继承机制。适合初学者深入理解JS面向对象编程的核心原理。
22 1
JavaScript中的原型 保姆级文章一文搞懂