diff --git a/convertor/convertor.go b/convertor/convertor.go index ecc7d98..20ebc74 100644 --- a/convertor/convertor.go +++ b/convertor/convertor.go @@ -175,6 +175,17 @@ func ToPointer[T any](value T) *T { return &value } +// ToMap convert a slice or an array of structs to a map +func ToMap[T any, K comparable, V any](array []T, iteratee func(T) (K, V)) map[K]V { + res := make(map[K]V, len(array)) + for _, item := range array { + k, v := iteratee(item) + res[k] = v + } + + return res +} + // StructToMap convert struct to map, only convert exported struct field // map key is specified same as struct field tag `json` value func StructToMap(value any) (map[string]any, error) { diff --git a/convertor/convertor_test.go b/convertor/convertor_test.go index 4bcbb45..0ec2fab 100644 --- a/convertor/convertor_test.go +++ b/convertor/convertor_test.go @@ -142,6 +142,25 @@ func TestToJson(t *testing.T) { assert.Equal("{\"Name\":\"TestStruct\"}", structJsonStr) } +func TestToMap(t *testing.T) { + assert := internal.NewAssert(t, "TestStructToMap") + + type Message struct { + name string + code int + } + messages := []Message{ + {name: "Hello", code: 100}, + {name: "Hi", code: 101}, + } + result := ToMap(messages, func(msg Message) (int, string) { + return msg.code, msg.name + }) + expected := map[int]string{100: "Hello", 101: "Hi"} + + assert.Equal(expected, result) +} + func TestStructToMap(t *testing.T) { assert := internal.NewAssert(t, "TestStructToMap")