yao/utils/tree/tree.go
2023-02-01 17:25:11 +08:00

52 lines
1.2 KiB
Go

package tree
import (
"fmt"
"github.com/yaoapp/gou/process"
)
// ProcessFlatten utils.tree.Flatten cast to array
func ProcessFlatten(process *process.Process) interface{} {
process.ValidateArgNums(1)
array := process.ArgsArray(0)
option := process.ArgsMap(1, map[string]interface{}{"primary": "id", "children": "children", "parent": "parent"})
if _, has := option["primary"]; !has {
option["primary"] = "id"
}
if _, has := option["children"]; !has {
option["children"] = "children"
}
if _, has := option["parent"]; !has {
option["parent"] = "parent"
}
return flatten(array, option, nil)
}
func flatten(array []interface{}, option map[string]interface{}, id interface{}) []interface{} {
parent := fmt.Sprintf("%v", option["parent"])
primary := fmt.Sprintf("%v", option["primary"])
childrenField := fmt.Sprintf("%v", option["children"])
res := []interface{}{}
for _, v := range array {
row, ok := v.(map[string]interface{})
if !ok {
continue
}
row[parent] = id
children, ok := row[childrenField].([]interface{})
delete(row, childrenField)
res = append(res, row)
if ok {
res = append(res, flatten(children, option, row[primary])...)
}
}
return res
}