一个很简单的func进行排序、还需要进行实现的有time的排序、string类型的,大家可以参考这个改改:
package main
import (
"fmt"
"sort"
)
// Int converts `any` to int.
func Int(any interface{}) int {
if any == nil {
return 0
}
if v, ok := any.(int); ok {
return v
}
return 0
}
func main() {
source := []map[string]interface{}{
{"name": "jack", "age": 18},
{"name": "rose", "age": 25},
{"name": "snap", "age": 20},
}
r := OrderSliceMap(source, "age", "int", OrderTypeDesc)
fmt.Println(r)
}
// 排序枚举值
type OrderType string
const (
OrderTypeDesc OrderType = "desc"
OrderTypeAsc OrderType = "asc"
)
// OrderSliceMap 对集合数组按照一个key进行排序
func OrderSliceMap(source []map[string]interface{}, childrenIdx string, childrenDataType string, orderType OrderType) (result []map[string]interface{}) {
switch childrenDataType {
case "int":
cc := []*One{}
for sourceIdx, sourceItem := range source {
cc = append(cc, &One{
Idx: sourceIdx,
Num: Int(sourceItem[childrenIdx]),
})
}
switch orderType {
case OrderTypeAsc:
sort.Sort(OneList(cc))
case OrderTypeDesc:
sort.Sort(sort.Reverse(OneList(cc)))
}
for _, ccItem := range cc {
result = append(result, source[ccItem.Idx])
}
case "time":
}
return
}
type One struct {
Idx int
Num int
}
type OneList []*One
func (_this OneList) Len() int {
return len(_this)
}
func (_this OneList) Less(i, j int) bool {
return _this[i].Num < _this[j].Num
}
func (_this OneList) Swap(i, j int) {
_this[i], _this[j] = _this[j], _this[i]
}
参考博客:
https://www.jianshu.com/p/c118d2de698e (可以,很细心很详细)