js:数组与树形结构的相互转换
2023-09-27 14:27:09 时间
数组转树
let arr =[
{id:2,name:'部门B',parentId:0},
{id:3,name:'部门C',parentId:1},
{id:1,name:'部门A',parentId:2},
{id:4,name:'部门D',parentId:1},
{id:5,name:'部门E',parentId:2},
{id:6,name:'部门F',parentId:3},
{id:7,name:'部门G',parentId:2},
{id:8,name:'部门H',parentId:4}
];
/**
* 数组转树 非递归求解
* 利用数组和对象相互引用 时间复杂度O(n)
* @param {Object} list
*/
function totree(list,parId) {
let obj = {};
let result = [];
//将数组中数据转为键值对结构 (这里的数组和obj会相互引用)
list.map(el => {
obj[el.id] = el;
})
for(let i=0, len = list.length; i < len; i++) {
let id = list[i].parentId;
if(id == parId) {
result.push(list[i]);
continue;
}
if(obj[id].children) {
obj[id].children.push(list[i]);
} else {
obj[id].children = [list[i]];
}
}
return result;
}
let res1 = totree(arr,0)
/**
* 数组转树 递归求解
*/
function toTree(list,parId){
let len = list.length
function loop(parId){
let res = [];
for(let i = 0; i < len; i++){
let item = list[i]
if(item.parentId === parId){
item.children = loop(item.id)
res.push(item)
}
}
return res
}
return loop(parId)
}
let result = toTree(arr,0)
树转数组
let tree = [
{
id: 1,
name: 'text1',
parentId: 1,
children: [
{
id: 2,
name: 'text2',
parentId: 1,
children: [
{
id: 4,
name: 'text4',
parentId: 2
}
]
},
{
id: 3,
name: 'text3',
parentId: 1
}
]
}
]
/**
* 树转数组扁平化结构
* 深度优先遍历 堆栈 后进先出
*/
function deep(node){
let stack = node,
data = [];
while(stack.length != 0){
let pop = stack.pop();
data.push({
id: pop.id,
name: pop.name,
parentId: pop.parentId
})
let children = pop.children
if(children){
for(let i = children.length-1; i >=0; i--){
stack.push(children[i])
}
}
}
return data
}
//console.log(deep(res1))
/**
* 树转数组扁平化结构
* 深度优先遍历 递归
*/
function deepTraversal(data) {
const result = [];
data.forEach(item => {
const loop = data => {
result.push({
id: data.id,
name: data.name,
parentId: data.parentId
});
let child = data.children
if(child){
for(let i = 0; i < child.length; i++){
loop(child[i])
}
}
}
loop(item);
})
return result;
}
//console.log(deepTraversal(res1))
/**
* 广度优先
* 队列 先进先出
*/
function wideTraversal(node){
let stack = node,
data = [];
while(stack.length != 0){
let shift = stack.shift();
data.push({
id: shift.id,
name: shift.name,
parentId: shift.parentId
})
let children = shift.children
if(children){
for(let i = 0; i < children.length; i++){
stack.push(children[i])
}
}
}
return data
}
//console.log(wideTraversal(res1))
相关文章
- js 处理 带T的时间日期格式,js时间日期格式转换
- js将long日期格式转换为标准日期格式
- Asp.net/Jquery/JS中各种数据转换为【JSON数据格式】的类!(相当好,转)
- js深拷贝、数组扁平化(数组展平)
- 【前端】JS耗时计算/时间转换/日期/本周/本月/格式化
- js汉字转换为拼音
- js捕获错误
- js中一些关于比较左右两边的值的题目
- JS中的进制转换以及作用
- 《Ext JS实战》——2.3 使用Template和XTemplate
- JS中的进制转换
- js 将json字符串转换为json对象的方法解析
- JS内置对象之Math(附代码及演示效果)
- 异步js
- js把数组转换为以逗号分隔的字符串
- JS将数字转换为大写汉字人民币
- Js 处理将时间转换 “年-月-日”
- JS中将一个值转换为字符串的3种方法
- 10个常见的Node.js面试题
- js 图片转换base64 base64转换为file对象
- js把预定义的html字符串转换为 HTML 实体 htmlspecialchars 输出html实体内容包括标签,而不自动转义标签,只显示内容,类似php的htmlspecialchars
- 微软开源Chakra,并计划在上面运行Node.js
- js 数组 深拷贝 复制 (汇总)
- Three.js Example 注解 —— canvas_lines_colors.html
- Android js 互调