| 123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- /**
- * 优化后的查询函数
- * @param {Array|Object} list - 查询的数据源
- * @param {Array} tier - 路径层级数组 (例如: ['systemA', 'moduleB'])
- * @param {Array} need - 需要匹配的 systemmodulename 集合
- */
- const nameKeys = ['modules', 'apps'];
- function query(list, tier, need) {
- // 1. 边界检查
- if (!list || (Array.isArray(list) && list.length === 0)) return [];
-
- // 2. 统一处理:如果是对象,则提取出 modules 或 apps 对应的数组
- if (!Array.isArray(list)) {
- const key = Object.keys(list).find(k => nameKeys.includes(k));
- return key ? query(list[key], tier, need) : [];
- }
- const [currentLevel, ...restLevels] = tier;
- // 3. 在当前层级寻找匹配 systemname 的节点
- const target = list.find(item => item.systemname === currentLevel);
- if (!target) return [];
- // 4. 判断是否到达路径最后一层
- if (restLevels.length > 0) {
- // 还没到最后一层,递归进入下一级
- return query(target, restLevels, need);
- }
- // 5. 到达最后一层,执行筛选逻辑
- // 先获取最后一层实际的数据数组(考虑嵌套在 modules/apps 里的情况)
- let finalArr = target;
- if (!Array.isArray(finalArr)) {
- const key = Object.keys(finalArr).find(k => nameKeys.includes(k));
- finalArr = key ? finalArr[key] : [];
- }
- // 确保 finalArr 是数组后进行过滤
- return Array.isArray(finalArr)
- ? finalArr.filter(item => need.includes(item.systemmodulename))
- : [];
- }
- module.exports.query = query;
|