@aniyajs/plugin-router
Version:
基于 react-routerV6 封装的路由插件服务于aniyajs自动化脚手架
83 lines (75 loc) • 2.17 kB
JavaScript
/**
* 将具有嵌套结构的数组展平为一维数组。
* @param {Array} initArr 初始数组,需要被展平的数组
* @param {string} childrenField 子元素字段名,标识数组元素中的子元素属性
* @returns {Array} 返回展平后的一维数组
*/
export function flatArr({
initArr,
childrenField,
newArr = [],
parentId = "",
level = 1,
}) {
// 遍历初始数组中的每个元素
for (let i = 0; i < initArr.length; i++) {
const ele = initArr[i];
// 如果当前元素包含子元素且子元素数组不为空
if (ele[childrenField] && ele[childrenField].length) {
// 递归调用flatArr函数处理子元素数组
flatArr({
initArr: ele[childrenField],
newArr,
childrenField,
parentId: parentId + "_" + String(i),
level: level + 1,
});
}
// 将当前元素及其附加信息(父ID和层级)添加到展平后的数组
newArr.push({
...ele,
parentId: parentId + "_" + String(i),
level,
});
}
return newArr;
}
/**
* 重组一维为多维
* 对应 flatArr 函数使用,当然后面可以优化
*
* @param {Array} initArr 初始一维数组
* @returns
*/
export function convertData({ initArr }) {
const levelObjects = initArr.reduce((acc, obj) => {
if (!acc.length || obj.level > acc[0].level) {
return [obj];
} else if (obj.level === acc[0].level) {
return [...acc, obj];
}
return acc;
}, []);
let extraArr = initArr.filter((item) =>
levelObjects.findIndex((i) => i.level === item.level),
);
for (let i = 0; i < levelObjects.length; i++) {
const ele = levelObjects[i];
const lastIndex = ele.parentId.lastIndexOf("_");
const parentId = ele.parentId.substring(0, lastIndex);
extraArr = extraArr.map((item) => {
if (item.parentId === parentId) {
return {
...item,
children: [...(item.children ? item.children : []), ele],
};
}
return item;
});
}
if (initArr.findIndex((item) => item.level > 1) > -1) {
return convertData({ initArr: extraArr });
} else {
return initArr;
}
}