|
|
@ -1,7 +1,7 @@ |
|
|
export class BaseTreeNode<T extends object> { |
|
|
export class BaseTreeNode<T extends object> { |
|
|
children: TreeNode<T>[] = []; |
|
|
children: TreeNode<T>[] = []; |
|
|
isLeaf = true; |
|
|
isLeaf = true; |
|
|
parent: TreeNode<T>; |
|
|
parent?: TreeNode<T>; |
|
|
|
|
|
|
|
|
constructor(props: T) { |
|
|
constructor(props: T) { |
|
|
Object.assign(this, props); |
|
|
Object.assign(this, props); |
|
|
@ -14,7 +14,7 @@ export class BaseTreeNode<T extends object> { |
|
|
|
|
|
|
|
|
export function createTreeFromList<T extends object, R extends unknown>( |
|
|
export function createTreeFromList<T extends object, R extends unknown>( |
|
|
list: T[], |
|
|
list: T[], |
|
|
keySelector: (item: T) => number | string | symbol, |
|
|
keySelector: (item: T) => NodeKey, |
|
|
parentKeySelector: typeof keySelector, |
|
|
parentKeySelector: typeof keySelector, |
|
|
valueMapper: (item: T) => R, |
|
|
valueMapper: (item: T) => R, |
|
|
) { |
|
|
) { |
|
|
@ -26,6 +26,8 @@ export function createTreeFromList<T extends object, R extends unknown>( |
|
|
const parentId = parentKeySelector(row); |
|
|
const parentId = parentKeySelector(row); |
|
|
const node = map.get(id); |
|
|
const node = map.get(id); |
|
|
|
|
|
|
|
|
|
|
|
if (!node) return; |
|
|
|
|
|
|
|
|
if (parentId) { |
|
|
if (parentId) { |
|
|
const parent = map.get(parentId); |
|
|
const parent = map.get(parentId); |
|
|
if (!parent) return; |
|
|
if (!parent) return; |
|
|
@ -42,7 +44,7 @@ export function createTreeFromList<T extends object, R extends unknown>( |
|
|
|
|
|
|
|
|
export function createMapFromList<T extends object, R extends unknown>( |
|
|
export function createMapFromList<T extends object, R extends unknown>( |
|
|
list: T[], |
|
|
list: T[], |
|
|
keySelector: (item: T) => number | string | symbol, |
|
|
keySelector: (item: T) => NodeKey, |
|
|
valueMapper: (item: T) => R, |
|
|
valueMapper: (item: T) => R, |
|
|
) { |
|
|
) { |
|
|
type Key = ReturnType<typeof keySelector>; |
|
|
type Key = ReturnType<typeof keySelector>; |
|
|
@ -60,6 +62,8 @@ export type TreeNode<T extends object> = { |
|
|
parent?: TreeNode<T>; |
|
|
parent?: TreeNode<T>; |
|
|
}; |
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
type NodeKey = number | string | symbol | undefined | null; |
|
|
|
|
|
|
|
|
type NodeValue<T extends object, F extends (...args: any) => any> = F extends undefined |
|
|
type NodeValue<T extends object, F extends (...args: any) => any> = F extends undefined |
|
|
? TreeNode<T> |
|
|
? TreeNode<T> |
|
|
: ReturnType<F>; |
|
|
: ReturnType<F>; |
|
|
|