距离上一次更新该文章已经过了 712 天,文章所描述的內容可能已经发生变化,请留意。
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
| 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 }
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 }
func removeRepeatedElement[T interface{}](arr []*T, key string) (newArr []string) { newArr = make([]string, 0) for i := 0; i < len(arr); i++ { repeat := false ikeyAsVal := reflect.ValueOf(arr[i]).Elem().FieldByName(key).String() for j := i + 1; j < len(arr); j++ { jkeyAsVal := reflect.ValueOf(arr[j]).Elem().FieldByName(key).String() if ikeyAsVal == jkeyAsVal { repeat = true break } } if !repeat { newArr = append(newArr, ikeyAsVal) } } return newArr }
|