UNPKG

@aniyajs/plugin-router

Version:

基于 react-routerV6 封装的路由插件服务于aniyajs自动化脚手架

83 lines (75 loc) 2.17 kB
/** * 将具有嵌套结构的数组展平为一维数组。 * @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; } }