12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import _ from "lodash";
- export const s3ContentsToTree = (
- s3Contents,
- props = {},
- reducer: (...args: unknown[]) => Record<string, unknown> = () => ({})
- ) => {
- let __result = [];
- let level = { __result, __prefix: "" };
- props = Object.assign(
- {
- key: "key",
- label: "label",
- children: "children",
- },
- props
- );
- s3Contents.forEach((s3Content) => {
- s3Content.Key.split("/").reduce((r, label, i, a) => {
- if (!r[label]) {
- const __prefix = `${r.__prefix ? r.__prefix + "/" : ""}${label}`;
- r[label] = { __result: [], __prefix };
- r.__result.push({
- [props.key]: __prefix,
- [props.label]: label,
- [props.children]: r[label].__result,
- // NOTE 这里要小心覆盖掉props.key props.label props.children
- ...reducer(r, label, i, a, s3Content),
- });
- }
- return r[label];
- }, level);
- });
- return __result;
- };
- export const trimTreeForSideBar = (tree) => {};
- type TreeNodeLike = {
- children?: TreeNodeLike[];
- };
- export const getTreeFlatten = <T extends TreeNodeLike>(
- treeNode: T,
- order: "preorder" | "postorder" = "preorder",
- mode: "all" | "leaf" = "leaf"
- ): T[] => {
- if (treeNode.children?.length) {
- const result = _.flatMap<T, T>(treeNode.children as T[], (node) =>
- getTreeFlatten(node, order, mode)
- )
- if (mode === 'all') {
- if (order === 'preorder') {
- result.unshift(treeNode)
- } else if (order === 'postorder') {
- result.push(treeNode)
- }
- }
- return result
- }
- return [treeNode];
- };
|