mirror of
https://github.com/carbon-design-system/carbon-components-svelte.git
synced 2025-09-15 10:21:05 +00:00
Refactor `toHiearchy` to be more generic, performant - Use callback to "pick" generic parent ID property instead of requiring that `pid` be hardcoded` - Account for edge cases of an invalid parent ID - Use Map to store node children for lookups - Use one pass instead of removing empty nodes at the very end - DX: use generics to type `toHierarchy` - Make `toHierarchy` even more generic (reusable with `RecursiveList`) Co-Authored-By: Bram <bramhavers@gmail.com>
21 lines
529 B
TypeScript
21 lines
529 B
TypeScript
type NodeLike = {
|
|
id: string | number;
|
|
nodes?: NodeLike[];
|
|
[key: string]: any;
|
|
};
|
|
|
|
/** Create a hierarchical tree from a flat array. */
|
|
export function toHierarchy<
|
|
T extends NodeLike,
|
|
K extends keyof Omit<T, "id" | "nodes">,
|
|
>(
|
|
flatArray: T[] | readonly T[],
|
|
/**
|
|
* Function that returns the parent ID for a given node.
|
|
* @example
|
|
* toHierarchy(flatArray, (node) => node.parentId);
|
|
*/
|
|
getParentId: (node: T) => T[K] | null,
|
|
): (T & { nodes?: (T & { nodes?: T[] })[] })[];
|
|
|
|
export default toHierarchy;
|