场景:
前端给后端传多个排序字段,当某一个不为0时,则使用对应指标排序,1为升序,2为降序
举例 order_by_a=0,order_by_b=1,order_by_c=0,则根据b指标进行排序,设定多个指标只会对其中一个进行排序,其余为0自动忽略,如果b相同,则按照D排序,指标数量可能递增
思路:
1.传进来的多个指标需要判断是否走排序逻辑
func IsSort(c Conditions) bool {
if c.OrderByA != 0 || c.OrderByB != 0 || c.OrderByC != 0 || c.OrderByD != 0 {
return true
}
return false
}
2.构造排序函数
func init() {
act = make(map[string]string)
act["OrderByA"] = "A"
act["OrderByB"] = "B"
act["OrderByC"] = "C"
act["OrderByD"] = "D"
}
func ActSort(resp1, resp2 Resp, c Conditions) bool {
cmap := make(map[string]int)
data, err := json.Marshal(c) // 此处做marshal的原因将整个结构体序列化成字符串
if err != nil {
return false
}
sortFields := &models.SortField{}
err = json.Unmarshal(data, sortFields) // 将字符串反序列化成需要排序的几个指标
data, err = json.Marshal(sortFields)
err = json.Unmarshal(data, &cmap) // 将字符串映射到map中
if err != nil {
return false
}
for k, v := range cmap { // 此时cmap的key为排序指标,value为值(升序或者降序规则)
if v == 0 { // 如果为0,则不按照此指标排序,直接跳过
continue
}
target1 := reflect.ValueOf(resp1).FieldByName(act[k]).String() // 将排序指标映射到resp1的结构体的字段中,获取resp1中act[k]的值
target2 := reflect.ValueOf(resp2).FieldByName(act[k]).String()
D1 := reflect.ValueOf(resp1).FieldByName("D").String()
D2 := reflect.ValueOf(resp2).FieldByName("D").String()
if v == 1 {
if target1 == target2 {
return judgeString(D1, D2)
}
return judgeString(target1, target2)
}
if v == 2 {
if target1 == target2 {
return !judgeString(D1, D2)
}
return !judgeString(target1, target2)
}
}
return true
}
func judgeString(num1, num2 string) bool { // 字符串类型的整数数据排序规则,从大到小
if len(num1) > len(num2) { // 长度长的大
return true
} else if len(num1) < len(num2) { // 长度短的小
return false
}
return num1 > num2 // 长度相同的则按照字符串的排序规则
}