From d06cde3fcfe087d77fb19864e247eda4423692f6 Mon Sep 17 00:00:00 2001 From: dudaodong Date: Mon, 11 Jul 2022 10:27:38 +0800 Subject: [PATCH] feat: add ToMap function --- convertor/convertor.go | 11 +++++++++++ convertor/convertor_test.go | 19 +++++++++++++++++++ 2 files changed, 30 insertions(+) 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")