s3Helper.ts 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import _ from "lodash";
  2. export const s3ContentsToTree = (
  3. s3Contents,
  4. props = {},
  5. reducer: (...args: unknown[]) => Record<string, unknown> = () => ({})
  6. ) => {
  7. let __result = [];
  8. let level = { __result, __prefix: "" };
  9. props = Object.assign(
  10. {
  11. key: "key",
  12. label: "label",
  13. children: "children",
  14. },
  15. props
  16. );
  17. s3Contents.forEach((s3Content) => {
  18. s3Content.Key.split("/").reduce((r, label, i, a) => {
  19. if (!r[label]) {
  20. const __prefix = `${r.__prefix ? r.__prefix + "/" : ""}${label}`;
  21. r[label] = { __result: [], __prefix };
  22. r.__result.push({
  23. [props.key]: __prefix,
  24. [props.label]: label,
  25. [props.children]: r[label].__result,
  26. // NOTE 这里要小心覆盖掉props.key props.label props.children
  27. ...reducer(r, label, i, a, s3Content),
  28. });
  29. }
  30. return r[label];
  31. }, level);
  32. });
  33. return __result;
  34. };
  35. export const trimTreeForSideBar = (tree) => {};
  36. type TreeNodeLike = {
  37. children?: TreeNodeLike[];
  38. };
  39. export const getTreeFlatten = <T extends TreeNodeLike>(
  40. treeNode: T,
  41. order: "preorder" | "postorder" = "preorder",
  42. mode: "all" | "leaf" = "leaf"
  43. ): T[] => {
  44. if (treeNode.children?.length) {
  45. const result = _.flatMap<T, T>(treeNode.children as T[], (node) =>
  46. getTreeFlatten(node, order, mode)
  47. )
  48. if (mode === 'all') {
  49. if (order === 'preorder') {
  50. result.unshift(treeNode)
  51. } else if (order === 'postorder') {
  52. result.push(treeNode)
  53. }
  54. }
  55. return result
  56. }
  57. return [treeNode];
  58. };