1.18出来了,把之前一堆groupBy的代码拿出来用泛型改一下,效率可能略有下降,但是小频率使用,效果还行

**注:**这里的T必须是struct,而且key必须是string

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// GroupByMap 切片按key(字段)分组转map
func GroupByMap[T interface{}](values []*T, key string) map[string][]*T {
mapObj := make(map[string][]*T)
// 先去重
for _, groupKey := range removeRepeatedElement(values, key) {
// 再过滤
arr := filter(values, key, groupKey)
mapObj[groupKey] = arr
}
return mapObj
}

// 过滤,将每个key对应的val放置切片
func filter[T interface{}](arr []*T, key, keyAsVal string) (newArr []*T) {
newArr = make([]*T, 0)
for _, item := range arr {
itemVal := reflect.ValueOf(item).Elem().FieldByName(key).String()
if itemVal == keyAsVal {
newArr = append(newArr, item)
}
}
return newArr
}

// 将所有的key取出来并去重
func removeRepeatedElement[T interface{}](arr []*T, key string) (newArr []string) {
newArr = make([]string, 0)
for i := 0; i < len(arr); i++ {
repeat := false
// 反射取key对应的val
ikeyAsVal := reflect.ValueOf(arr[i]).Elem().FieldByName(key).String()
for j := i + 1; j < len(arr); j++ {
// 反射取key对应的val
jkeyAsVal := reflect.ValueOf(arr[j]).Elem().FieldByName(key).String()
if ikeyAsVal == jkeyAsVal {
repeat = true
break
}
}
if !repeat {
newArr = append(newArr, ikeyAsVal)
}
}
return newArr
}