package tree import ( "regexp" ) type Node[T any] struct { Data T `json:"data"` Children []Node[T] `json:"children"` } func Length(code string) int { re := regexp.MustCompile(`[A-Z]\d+`) match := re.FindString(code) return len(match) } // 适用 A00001B00001 层级结构 // parent 父级字符串 // length A00001 一个节点长度 // pathFunc 返回T的code A00001 func Tree[T any](data []T, parent string, length int, pathFunc func(d T) string) (res []Node[T]) { for _, v := range data { path := pathFunc(v) if len(path) < length { return } p := path[:len(path)-length] if p == parent { res = append(res, Node[T]{ Data: v, Children: Tree[T](data, path, length, pathFunc), }) } } return } // 拆分层级结构 A00001B00001C00001 拆分为 ["A00001","A00001B00001","A00001B00001C00001"] func Split(code string) (res []string) { if code == "" { return []string{} } l := Length(code) if len(code) < l { return } times := len(code) / l for i := 0; i < times; i++ { res = append(res, code[:len(code)-l*i]) } return }