52 lines
1.2 KiB
Go
52 lines
1.2 KiB
Go
package tree
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/yaoapp/gou"
|
|
)
|
|
|
|
// ProcessFlatten utils.tree.Flatten cast to array
|
|
func ProcessFlatten(process *gou.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
|
|
}
|