nested-object.ts 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { toLowerCaseFirstLetter } from '@vben-core/toolkit';
  2. /**
  3. * 将扁平对象转换为嵌套对象。
  4. *
  5. * @template T - 输入对象值的类型
  6. * @param {Record<string, T>} obj - 要转换的扁平对象
  7. * @param {number} level - 嵌套的层级
  8. * @returns {T} 嵌套对象
  9. *
  10. * @example
  11. * 将扁平对象转换为嵌套对象,嵌套层级为 1
  12. * const flatObject = {
  13. * 'commonAppName': 1,
  14. * 'anotherKeyExample': 2,
  15. * 'someOtherKey': 3
  16. * };
  17. * const nestedObject = nestedObject(flatObject, 1);
  18. * console.log(nestedObject);
  19. * 输出:
  20. * {
  21. * commonAppName: 1,
  22. * anotherKeyExample: 2,
  23. * someOtherKey: 3
  24. * }
  25. *
  26. * @example
  27. * 将扁平对象转换为嵌套对象,嵌套层级为 2
  28. * const flatObject = {
  29. * 'appCommonName': 1,
  30. * 'appAnotherKeyExample': 2,
  31. * 'appSomeOtherKey': 3
  32. * };
  33. * const nestedObject = nestedObject(flatObject, 2);
  34. * console.log(nestedObject);
  35. * 输出:
  36. * {
  37. * app: {
  38. * commonName: 1,
  39. * anotherKeyExample: 2,
  40. * someOtherKey: 3
  41. * }
  42. * }
  43. */
  44. function nestedObject<T>(obj: Record<string, T>, level: number): T {
  45. const result: any = {};
  46. for (const key in obj) {
  47. const keys = key.split(/(?=[A-Z])/);
  48. // 将驼峰式分割为数组;
  49. let current = result;
  50. for (let i = 0; i < keys.length; i++) {
  51. const lowerKey = keys[i].toLowerCase();
  52. if (i === level - 1) {
  53. const remainingKeys = keys.slice(i).join(''); // 保留后续部分作为键的一部分
  54. current[toLowerCaseFirstLetter(remainingKeys)] = obj[key];
  55. break;
  56. } else {
  57. current[lowerKey] = current[lowerKey] || {};
  58. current = current[lowerKey];
  59. }
  60. }
  61. }
  62. return result as T;
  63. }
  64. export { nestedObject };