1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- package util
- import (
- "encoding/json"
- "fmt"
- "reflect"
- "sort"
- )
- // 排序 排序键必须为数字类型
- type SortBy struct {
- Data []map[string]interface{}
- Sortkey string
- }
- func (a SortBy) Len() int { return len(a.Data) }
- func (a SortBy) Swap(i, j int) {
- a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
- }
- func (a SortBy) Less(i, j int) bool {
- //return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
- m := a.Data[i][a.Sortkey]
- n := a.Data[j][a.Sortkey]
- w := reflect.ValueOf(m)
- v := reflect.ValueOf(n)
- switch v.Kind() {
- case reflect.String:
- return w.String() < v.String()
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
- return w.Int() < v.Int()
- case reflect.Float64, reflect.Float32:
- return w.Float() < v.Float()
- default:
- return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
- }
- }
- // 根据指定字符排序
- //
- // m := []map[string]int{
- // {"k": 2},
- // {"k": 1},
- // {"k": 3},
- // }
- //
- // customer.SortData(&m, "k", true)
- // ture 倒序3, 2, 1
- // fmt.Println(m)
- func SortData(data interface{}, sortkey string, reverse bool) {
- //func SortData(data interface{}, sortkey string, reverse bool) {
- var db []map[string]interface{}
- err := Bind(data, &db)
- if err != nil {
- fmt.Println(err)
- return
- }
- stb := SortBy{db, sortkey}
- if !reverse {
- sort.Sort(stb)
- } else {
- sort.Sort(sort.Reverse(stb))
- }
- err = Bind(stb.Data, data)
- if err != nil {
- fmt.Println(err)
- }
- }
- func Bind(data interface{}, ret interface{}) error {
- v := reflect.ValueOf(ret)
- if v.Kind() != reflect.Ptr {
- return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
- }
- havdata := false
- var bk interface{}
- if v.Elem().Kind() == reflect.Slice {
- t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
- bk = v.Elem().Interface()
- v.Elem().Set(t)
- havdata = true
- }
- _data, _ := json.MarshalIndent(data, "", " ")
- err := json.Unmarshal(_data, ret)
- if err != nil {
- fmt.Println(err)
- if havdata {
- v.Elem().Set(reflect.ValueOf(bk))
- }
- return err
- }
- return nil
- }
|