增加生成新节点的方法

This commit is contained in:
白茶清欢 2023-03-28 23:56:13 +08:00
parent 055c833fce
commit f24fe13e4b
3 changed files with 137 additions and 2 deletions

View File

@ -27,6 +27,8 @@ const (
const (
// ValueTypeString 字符串类型
ValueTypeString = "string"
// ValueTypeBool bool类型
ValueTypeBool = "bool"
// ValueTypeInteger int类型
ValueTypeInteger = "int64"
// ValueTypeFloat float类型
@ -36,3 +38,12 @@ const (
// ValueTypeArray 数组
ValueTypeArray = "array"
)
// isBaseDataType 是否为基础数据类型
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 23:16 2023/3/28
func isBaseDataType(valueType string) bool {
return valueType != ValueTypeArray && valueType != ValueTypeMap
}

View File

@ -7,11 +7,62 @@
// Date : 2023-03-28 18:42
package tree
import "strings"
// New 生成一棵JSON树
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 18:42 2023/3/28
func New(jsonData string) *Node {
return nil
func New(jsonData string) *Generate {
jsonData = strings.TrimSpace(jsonData)
g := &Generate{
jsonData: jsonData,
}
if g.isArray() {
g.root = &Node{
IsVirtual: true,
Value: nil,
ValueType: "",
Key: "",
Show: false,
ShowKey: "",
AllowEdit: false,
AllowChangeType: false,
DefaultValue: nil,
ParentNode: nil,
PreBrotherNode: nil,
LastBrotherNode: nil,
SonNodeList: nil,
}
}
return g
}
// Generate ...
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 22:46 2023/3/28
type Generate struct {
root *Node
jsonData string
}
// isObject 整体是否为对象
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 22:51 2023/3/28
func (g *Generate) isObject() bool {
return strings.HasPrefix(g.jsonData, KeywordObjectStart)
}
// isArray 整体是否为数组
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 22:51 2023/3/28
func (g *Generate) isArray() bool {
return strings.HasPrefix(g.jsonData, KeywordArrayStart)
}

View File

@ -7,6 +7,12 @@
// Date : 2023-03-28 18:12
package tree
import (
"strings"
"git.zhangdeman.cn/zhangdeman/util"
)
// Node 节点的数据结构
//
// Author : go_developer@163.com<白茶清欢>
@ -27,3 +33,70 @@ type Node struct {
LastBrotherNode *Node // 下一个兄弟节点
SonNodeList []*Node // 子节点列表
}
// NewNode 创建新节点
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 23:02 2023/3/28
func NewNode(key string, value string, valueType string, parentNode *Node) *Node {
n := &Node{
IsVirtual: false,
Value: value,
ValueType: valueType,
Key: key,
Show: false,
ShowKey: "",
AllowEdit: false,
AllowChangeType: false,
DefaultValue: nil,
ParentNode: parentNode,
PreBrotherNode: nil,
LastBrotherNode: nil,
SonNodeList: nil,
}
switch valueType {
case ValueTypeString:
n.Value = value
case ValueTypeInteger:
var v int64
_ = util.ConvertAssign(&v, value)
n.Value = v
case ValueTypeFloat:
var v float64
_ = util.ConvertAssign(&v, value)
n.Value = v
case ValueTypeBool:
n.Value = strings.ToLower(value) == "true"
case ValueTypeMap:
n.Value = map[string]interface{}{}
n.SonNodeList = make([]*Node, 0)
case ValueTypeArray:
n.Value = []interface{}{}
n.SonNodeList = make([]*Node, 0)
}
// 处理 preBrother 和 lastBrother
if parentNode.ValueType == ValueTypeMap || parentNode.ValueType == ValueTypeArray {
// map 和 array 才有所谓的兄弟节点
if len(parentNode.SonNodeList) > 0 {
// 设置新节点的 pre 节点
n.PreBrotherNode = parentNode.SonNodeList[len(parentNode.SonNodeList)-1]
// 设置当前最后一个节点的 last 节点
parentNode.SonNodeList[len(parentNode.SonNodeList)-1].LastBrotherNode = n
}
// 新节点追加到子节点末尾
parentNode.SonNodeList = append(parentNode.SonNodeList, n)
}
return n
}
// NewVirtualNode 创建一个新的虚拟节点
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 23:08 2023/3/28
func NewVirtualNode() *Node {
return &Node{IsVirtual: true, SonNodeList: make([]*Node, 0)}
}