diff --git a/maputil/map.go b/maputil/map.go index f9999d3..6c68811 100644 --- a/maputil/map.go +++ b/maputil/map.go @@ -46,6 +46,18 @@ func KeysBy[K comparable, V any, T any](m map[K]V, mapper func(item K) T) []T { return keys } +// ValuesBy creates a slice whose element is the result of function mapper invoked by every map's value. +// todo: +func ValuesBy[K comparable, V any, T any](m map[K]V, mapper func(item V) T) []T { + keys := make([]T, 0, len(m)) + + for _, v := range m { + keys = append(keys, mapper(v)) + } + + return keys +} + // Merge maps, next key will overwrite previous key. // Play: https://go.dev/play/p/H95LENF1uB- func Merge[K comparable, V any](maps ...map[K]V) map[K]V { diff --git a/maputil/map_test.go b/maputil/map_test.go index 21d298e..b101d48 100644 --- a/maputil/map_test.go +++ b/maputil/map_test.go @@ -59,6 +59,33 @@ func TestKeysBy(t *testing.T) { assert.Equal([]int{2, 3, 4}, keys) } +func TestValuesBy(t *testing.T) { + assert := internal.NewAssert(t, "TestValuesBy") + + m := map[int]string{ + 1: "a", + 2: "b", + 3: "c", + } + + values := ValuesBy(m, func(v string) string { + switch v { + case "a": + return "a-1" + case "b": + return "b-2" + case "c": + return "c-3" + default: + return "" + } + }) + + sort.Strings(values) + + assert.Equal([]string{"a-1", "b-2", "c-3"}, values) +} + func TestMerge(t *testing.T) { assert := internal.NewAssert(t, "TestMerge")