JS 递归应用场景

news/2024/7/11 0:57:16 标签: javascript, 前端, es6

问题描述

在使用Ant Design of Vue的 树型选择控件时,服务端返回的数据如下:

let arr = [
    {
      "id": "0",
      "pid": "-1",
      "value": "香港明华船务有限公司",
      "mmsi": null
    },
    {
      "id": "0-0",
      "pid": "0",
      "value": "超大型矿砂船",
      "mmsi": null
    },
    {
      "id": "0-0-0",
      "pid": "0-0",
      "value": "H1448",
      "mmsi": "477232500"
    },
    {
      "id": "0-0-1",
      "pid": "0-0",
      "value": "H1447",
      "mmsi": "477286900"
    }
 ]

树形控件需要的树形结构如下:

let arr = [
    {
      "id": "0",
      "pid": "-1",
      "value": "香港明华船务有限公司",
      "mmsi": null,
      children:[
        {
	      "id": "0-0",
	      "pid": "0",
	      "value": "超大型矿砂船",
	      "mmsi": null,
	      children:[
			   {
			      "id": "0-0-0",
			      "pid": "0-0",
			      "value": "H1448",
			      "mmsi": "477232500"
			    },
			    {
			      "id": "0-0-1",
			      "pid": "0-0",
			      "value": "H1447",
			      "mmsi": "477286900"
			    }
			]
	    }
  	  ]
    }
] 

代码如下

// 入口方式
//arr 待处理数组
//rootId 根ID
function getTrees (arr,rootId) {
  let resultArr = []
  // 将第一级计算
  arr.map(item => {
    if (item.pid == rootId) {
      resultArr.push(item)
    }
  })
  //循环第一级 进入递归
  resultArr.map(item => {
    return item = singleTree(arr,item)
  })
  return resultArr
}
// 单个树 通过递归计算
function singleTree (arr, obj) {
  // 判断是否含有下一级 
  let flag = arr.filter(item => {
    return item.pid === obj.id
  })
  // 开关 递归终止条件
  if (flag.length <= 0) {
    return obj
  }
  //循环体
  obj.children = []
  arr.map((item, index) => {
    if (item.pid === obj.id) {
      obj.children.push(item)
    }
    return item
  })
  // 循环自己调用递归
  obj.children.map(item => {
    return item = singleTree(arr,item)
  })
  return obj
}

let tableData = getTrees(arr,'-1')
console.log(tableData);

code可以实现多级树形结构处理


http://www.niftyadmin.cn/n/1852480.html

相关文章

基于DSP的IS95正向业务信道模块设计

**定时20ms循环处理话音数据包*** *伪指令不占空间不影响执行速度&#xff0c;只是定义和描述但对汇编链接有重要指示作用 *********************************.title "IS95前向信道设计" ;源程序名.global _c_int00 ;全局起始标号.mmregs …

JS 浏览器窗口控制

业务场景&#xff1a;老系统里&#xff08;非SPA&#xff09; 在主页面有很多子模块页面&#xff0c;在点击去到子模块a页面打开新窗口&#xff0c;如果a页面已经在浏览器打开则不打开新的窗口&#xff0c;切换至a页面窗口 首先&#xff0c;了解window对象 1.window.open win…

C# 读取Json文件

C#读取Json文件并赋值给初始值 一、有Json文件如下&#xff08;若用记事本编辑记得另存为-编码选择 U-TF8&#xff09;&#xff1a; 二、读取方法&#xff1a; using Newtonsoft.Json;using Newtonsoft.Json.Linq; /// <summary>/// 读取JSON文件/// </summary>///…

JS meta 标签作用

功能1&#xff1a; <meta http-equiv"refresh" content"0; url"http://www.baidu.com">重新定向到指定的网页&#xff0c;content后面跟的是时间&#xff08;单位秒&#xff09;&#xff0c; 把这句话加到指定网页的里 一般也用在实时性很强的…

3、Docker能干什么?

简化配置这是Docker公司宣传的Docker的主要使用场景。虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台&#xff08;软件、系统&#xff09;&#xff0c;Docker在降低额外开销的情况下提供了同样的功能。它能让你将运行环境和配置放在代码中然后部署&#xff0c;…

CSS 移动端布局

px rem em 1.px 固定的像素单位 2.em 相对父元素fontSize大小 3.rem 相对根元素 fontSize大小&#xff08;CSS3出现&#xff09;举个栗子 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"vie…

vue手写双向绑定实现

前言 认识Object.defineProperty() // Object.defineProperty 三个参数// 第一个参数&#xff0c;属性所在的对象// 第二个参数&#xff0c;要操作的属性// 第三个参数&#xff0c;被操作属性的特性// 格式是 {} //configurable,enumerable,value,writable// set 写入属性时触…

vue 组件通讯总结

Props $emit 方式 父子传参最常用的方式就是使用props,$emit 1. 父传子 子组件从父组件接受参数通过props&#xff0c;并且可以规定类型&#xff0c;默认值等 总结 1.父组件中 v-bind:parentToOne"parentMsg" , 一般parentToOne 与 parentMsg 名称相同即可 即&am…