queryPermissions.js 1.6 KB

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