/** * 优化后的查询函数 * @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;