背景交代:
需要在一个学院、专业、班级的树中,在专业与班级节点插入年级节点,达到更好区分的目的。
原来格式:
|---Academy
| |---Major
| |---Class
目标格式:
|---Academy
| |---Major
| |---Grade
| |---Class
本想利用Class中含有的Grade属性替换原有的父节点Major,再将Grade作为节点,其父节点置为原有的父节点Major。
子节点 | 父节点 | |
---|---|---|
old | 15级1班 | 法学 |
new | 15级1班 | 2015 |
2015 | 法学 |
由于Grade属性依附在在Class,生成的结构不符合要求!
应该是:
所以要把已经生成的年级节点记录一下,再有相同的专业下的年级节点,便不再生成了。
代码如下,利用一个Map存储已经生成的年级节点,如果已经生成年级节点,直接将该班级节点的父节点置为已经生成的年级节点。
func (abp *APIBasicParameterHandle) addGradeData(classData []map[string]string) []map[string]string {
// 存放年级节点
var gradeData []map[string]string
// 用于记录是否已生成年级节点
tmpMap := make(map[string]string)
count := 1
for _, vo := range classData {
gradeName := vo["GradeName"]
majorName := vo["ParentDepartName"]
if t, ok := tmpMap[gradeName+majorName]; ok {
vo["ParentDepartCode"] = t
vo["ParentDepartName"] = gradeName
continue
}
gradeCode := utility.NewUuid()
gradeOrganization := make(map[string]string)
gradeOrganization["DepartmentCode"] = gradeCode
gradeOrganization["DepartmentName"] = gradeName
gradeOrganization["Level"] = "5"
gradeOrganization["ParentDepartCode"] = vo["ParentDepartCode"]
gradeOrganization["ParentDepartName"] = vo["ParentDepartName"]
gradeOrganization["Squence"] = strconv.Itoa(count)
gradeData = append(gradeData, gradeOrganization)
tmpMap[gradeName+majorName] = gradeCode
vo["ParentDepartCode"] = gradeCode
vo["ParentDepartName"] = gradeName
delete(vo, "GradeName")
count++
}
classData = append(classData, gradeData...)
return classData
}
之前判断是否已经生成年级节点的方式是:循环classData判断class的父节点是否还是原先的节点。这样会多出两个for循环,循环中有很多重复判断数据。临时建立TmpMap,以"GradeName"+"MajorName"为Key,每次进入循环,判断该Key是否存在。如果存在,则该节点已经生成,直接将TmpMap中Key对应的Value更新为Class的父节点;如果不存在,则生成该年级节点,将该节点暂存,增加TmpMap对应关系,将Class的父节点更新。