本文详解JavaScript中扁平化数组与JSON树形结构的相互转换方法。通过递归与Array.reduce实现双向转换,并对比for-in与for-of在遍历数组和对象时的行为差异,帮助开发者掌握数据结构处理技巧。
直接开始讲解。
一、树形结构扁平化处理
核心思路:利用递归遍历。若对象包含children属性,则提取该子数组,同时解构对象的其他属性,最后将处理后的子数组与原对象属性合并。
具体实现代码如下:
//已知JSON树状形结构的数据data
let data = [
{id:1,title:'标题1',parent_id:0,},
{id:2,title:'标题2',parent_id:0,
children:[
{id:3,title:'标题2-1',parent_id:2,
children:[
{id:4,title:'标题3-1',parent_id:3,
children:[
{id:5,title:'标题4-1',parent_id:4}
]}
]},
{id:6,title:'标题2-2',parent_id:2}
]
}
],
function flat(data){
return data.reduce((pre,cur)=>{
// console.log(cur);
//此处将对象的children属性和值都解构在空数组中,将对象的其他属性和值都解构在i里面。
const {children=[],...i}=cur; // 注意 ...i 只能写在解构赋值的末尾,否则报错
// console.log(i);
// // console.log(children);
return pre.concat([{...i}],flat(children)) //利用递归回调,数组合并,注意此处 {...i}是解构
},[]);
}
console.log(flat(data)); 此处使用了ES6的解构赋值语法以及相对少见的Array.reduce方法。建议参考相关文档以深入理解。
二、扁平化数据转JSON树形结构
具体步骤已融入代码逻辑中。
代码如下:
//已知扁平化数据Arr
let Arr = [
{id:1,title:'标题1',parent_id:0},
{id:2,title:'标题2',parent_id:0},
{id:3,title:'标题2-1',parent_id:2},
{id:4,title:'标题3-1',parent_id:3},
{id:5,title:'标题4-1',parent_id:4},
{id:6,title:'标题2-2',parent_id:2},
];
const result = []
function fn(list){
const remap = list.reduce((pre,cur)=>{ //###第一步:将数组转换成键值对的形式(键是id值,值是对象)
// console.log(cur);
pre[cur.id]=cur
// console.log(pre);
return pre
},{})
//console.log(remap);
//###第二步,循环遍历数组,判断是不是(树状结构最外层,祖宗层数据)第一层的数据(本处就是parent_id等不等于0)
for(let item of list){ //用普通的for循环也行,但是用for in 不行,只能获取数组的元素下标,或者对象的键
console.log(item);
if(item.parent_id===0){
result.push(item)
continue
}
// console.log(item.parent_id);
// console.log(remap[item.parent_id]); //注意 obj[key] 就代表是对象的值value
if(item.parent_id in remap) { //换成else也可,目的将不是第一层的数据(parent_id不等于0)挑出来,并赋予一个children属性
const parent = remap[item.parent_id];
parent.children = parent.children || [];
// console.log(parent);
parent.children.push(item);
//console.log(parent);
}
}
// console.log(result);
return result
}
console.log(fn(Arr));补充知识点:for-in与for-of的区别
for-in循环可用于数组和对象,但仅能获取数组的索引或对象的键名。
for-of循环在遍历对象时会抛出错误,而在遍历数组时可直接获取元素值。
const arr = [2,3,4]
const obj = {
a:2,
b:3,
c:4
},
for (let item in arr){
console.log(item); // 0 , 1 , 2
}
for (let item of arr){
console.log(item); // 2 , 3 , 4
}
for (let item in obj){
console.log(item) // a ,b ,c
}
for (let item of obj ){
console.log(item) // Uncaught TypeError: arr is not iterable
}总结
至此,关于JavaScript中扁平化数据与JSON树形结构转换的内容介绍完毕。如需了解更多相关技巧,请查阅本站历史文章或继续阅读后续内容。