建网站公司销售,做co的网站,全球推广,太原网站建设的公司排名1.树形数组扁平化
数组扁平化的方式很多#xff0c;这里主要是用递归处理#xff0c;除此之外还有正则、扩展运算符等等 const list [{name:1,id:1,children:[{name:11,id:11,children:[{name:111,id:111}]},{name:12},]},{name:2,id:2,children:[{name:21,id:21,children:…1.树形数组扁平化
数组扁平化的方式很多这里主要是用递归处理除此之外还有正则、扩展运算符等等 const list [{name:1,id:1,children:[{name:11,id:11,children:[{name:111,id:111}]},{name:12},]},{name:2,id:2,children:[{name:21,id:21,children:[{name:221,id:221}]},{name:22,id:22},]},]// 树形数组扁平化const test (arr){const list []if(arr instanceof Array){for (let i 0; i arr.length; i) {const item arr[i];if(item.children item.children.length0){list.push(...test(item.children))//将每一层的结果push到list}delete item.children//视情况而定是否删除children属性list.push(item)}}return list}console.log(test(list,扁平化)); 2.树形数组格式化修改节点key值
使用for改变原数组的方式 // 树形数组递归格式化数组使用for改变原数组const format (arr){if(arr instanceof Array){for (let i 0; i arr.length; i) {const ele arr[i];ele.label ele.name;ele.value ele.id;delete ele.name;delete ele.id;if(ele.children ele.children.length0){format(ele.children);}}return arr}}
使用能生成新数组的方式 // 树形数组递归格式化数组使用forEach不改变原数组const format2 (arr){if(arr instanceof Array){return arr.map(item {item.label item.name;item.value item.id;delete item.name;delete item.id;if(item.children item.children.length0){format2(item.children);}return item});}} 3.获取树形数组中某个节点的所有父级节点 这个方式需要熟悉函数在堆栈中的调用顺序才好理解否则理解起来有点绕 const list [{name:1,id:1,children:[{name:11,id:11,children:[{name:111,id:111}]},{name:12},]},{name:2,id:2,children:[{name:21,id:21,children:[{name:221,id:221}]},{name:22,id:22},]},]
const getParentId (arr,id){for (let i 0; i arr.length; i) {const item arr[i]if(item.idid){return [item]}if(item.children item.children.length0){let node getParentId(item.children,id);//当当前item的有返回数组时则表示已经找到目标id节点item二级node三级// node表示目标节点而当前item则是第二次执行getParentId函数的item因为第三次调用的getParentId函数在堆栈中被(return)去除掉了if(node!undefined){return node.concat(item);//这里每return一次堆栈就会去除一次最顶层函数}}}}// js函数调用堆栈js每执行一个函数就会往堆栈放一个函数如果函数执行完或者return之后就会从堆栈剔除堆栈遵循先进后出的顺序// 执行顺序每执行一次函数往堆栈里面放一个函数// 执行函数getParentId(),往堆栈里面放一个函数// 第一遍代码执行到let node getParentId(item.children,id)的时候执行递归于是跳到函数getParentId的开头执行第二遍再放一个函数在堆栈// 第二次执行到let node getParentId(item.children,id)时候跟第一次一样继续执行递归函数getParentId再放一个函数在堆栈// 第三次执行的时候item.idid于是return掉当前的函数// 而当前是第三次执行的函数return之后当前函数就从堆栈中去除了堆栈只剩两个函数了(第一次执行的getParentId函数跟第二次执行getParentId函数)// 于是继续执行第二个getParentId它不会从头开始而是从第二次递归后面那里因为之前在这结束调转到函数开头的所以继续从这里执行开始执行// 发现node!undefined成立于是将第二个getParentId函数return掉从堆栈中去除// 去除之后堆栈中只剩第一次执行的getParentId函数此时不会从头开始执行而是继续在第一次递归调用那里往后执行因为之前在这结束调转到函数开头的所以继续从这里执行最终返回函数的结果