s3Helper.ts 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  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. }
  37. type TreeNodeLike = {
  38. children?: TreeNodeLike[];
  39. };
  40. export const getTreeLeafs = <T extends TreeNodeLike>(treeNode: T): T[] => {
  41. if (treeNode.children?.length) {
  42. return _.flatMap<T, T>(treeNode.children as T[], getTreeLeafs);
  43. }
  44. return [treeNode];
  45. };