1.数组拍平
1. flat()
arr.flat(Infinity)
2. toString()
arr.toString().split(',').map((item) => Number(item));
3. 递归+reduce
arr.reduce((total, item) => (Array.isArray(item) ? [...total, ...flat(item)] : [...total, item]),[],);
2.树结构转数组(递归)
//数据
const treeData = [
{
title: '0-0',
key: '0-0',
children: [
{
title: '0-0-0',
key: '0-0-0',
children: [
{ title: '0-0-0-0', key: '0-0-0-0' },
{ title: '0-0-0-1', key: '0-0-0-1' },
{ title: '0-0-0-2', key: '0-0-0-2' },
],
},
{
title: '0-0-1',
key: '0-0-1',
children: [
{ title: '0-0-1-0', key: '0-0-1-0' },
{ title: '0-0-1-1', key: '0-0-1-1' },
{ title: '0-0-1-2', key: '0-0-1-2' },
],
},
{
title: '0-0-2',
key: '0-0-2',
},
],
},
{
title: '0-1',
key: '0-1',
children: [
{ title: '0-1-0-0', key: '0-1-0-0' },
{ title: '0-1-0-1', key: '0-1-0-1' },
{ title: '0-1-0-2', key: '0-1-0-2' },
],
},
{
title: '0-2',
key: '0-2',
},
];
//方法函数
const treeToArray = (tree) => {
const result = [];//1.声明result保存转化后的数组
tree.forEach((item) => {
result.push({ ...item, children: null });//2.把第一层数组元素push到result中
item.children && result.concat(treeToArray(item.children));//3.如果存在子元素,就开始递归、拼接数组
});
return result;
};
//输出返回值
console.log(treeToArray(treeData));
3.数组转树结构(利用引用类型的特性)
//数据
const ArrayData = [
{ title: '0-0', key: '0-0', parentKey: '' },
{ title: '0-1', key: '0-1', parentKey: '' },
{ title: '0-2', key: '0-2', parentKey: '' },
{ title: '0-0-0', key: '0-0-0', parentKey: '0-0' },
{ title: '0-0-1', key: '0-0-1', parentKey: '0-0' },
{ title: '0-0-2', key: '0-0-2', parentKey: '0-0' },
{ title: '0-1-0-0', key: '0-1-0-0', parentKey: '0-1' },
{ title: '0-1-0-1', key: '0-1-0-1', parentKey: '0-1' },
{ title: '0-1-0-2', key: '0-1-0-2', parentKey: '0-1' },
{ title: '0-0-0-0', key: '0-0-0-0', parentKey: '0-0-0' },
{ title: '0-0-0-1', key: '0-0-0-1', parentKey: '0-0-0' },
{ title: '0-0-0-2', key: '0-0-0-2', parentKey: '0-0-0' },
{ title: '0-0-1-0', key: '0-0-1-0', parentKey: '0-0-1' },
{ title: '0-0-1-1', key: '0-0-1-1', parentKey: '0-0-1' },
{ title: '0-0-1-2', key: '0-0-1-2', parentKey: '0-0-1' },
];
//方法
const arrayToTree = (tree: any[]) => {
let result = []; //返回的树结构
let treeMap = {}; //用传进来的每个项的id作为键值,建立一棵树
tree.forEach((item) => {
item.children = [];
treeMap[item.key] = item; //浅拷贝,共享引用
});
tree.forEach((item) => {
if (item.parentKey === '') {
result.push(item);
} else {
treeMap[item.parentKey].children.push(item);//修改treeMap的值,result中的值也会随之变化。因为他们复制的是tree的地址(引用类型)。
}
});
return result; // result 转化后的树形结构数据
};
//输出
console.log(arrayToTree(ArrayData));