1 package objx
2 3 // Exclude returns a new Map with the keys in the specified []string
4 // excluded.
5 func (m Map) Exclude(exclude []string) Map {
6 excluded := make(Map)
7 for k, v := range m {
8 if !contains(exclude, k) {
9 excluded[k] = v
10 }
11 }
12 return excluded
13 }
14 15 // Copy creates a shallow copy of the Obj.
16 func (m Map) Copy() Map {
17 copied := Map{}
18 for k, v := range m {
19 copied[k] = v
20 }
21 return copied
22 }
23 24 // Merge blends the specified map with a copy of this map and returns the result.
25 //
26 // Keys that appear in both will be selected from the specified map.
27 // This method requires that the wrapped object be a map[string]interface{}
28 func (m Map) Merge(merge Map) Map {
29 return m.Copy().MergeHere(merge)
30 }
31 32 // MergeHere blends the specified map with this map and returns the current map.
33 //
34 // Keys that appear in both will be selected from the specified map. The original map
35 // will be modified. This method requires that
36 // the wrapped object be a map[string]interface{}
37 func (m Map) MergeHere(merge Map) Map {
38 for k, v := range merge {
39 m[k] = v
40 }
41 return m
42 }
43 44 // Transform builds a new Obj giving the transformer a chance
45 // to change the keys and values as it goes. This method requires that
46 // the wrapped object be a map[string]interface{}
47 func (m Map) Transform(transformer func(key string, value interface{}) (string, interface{})) Map {
48 newMap := Map{}
49 for k, v := range m {
50 modifiedKey, modifiedVal := transformer(k, v)
51 newMap[modifiedKey] = modifiedVal
52 }
53 return newMap
54 }
55 56 // TransformKeys builds a new map using the specified key mapping.
57 //
58 // Unspecified keys will be unaltered.
59 // This method requires that the wrapped object be a map[string]interface{}
60 func (m Map) TransformKeys(mapping map[string]string) Map {
61 return m.Transform(func(key string, value interface{}) (string, interface{}) {
62 if newKey, ok := mapping[key]; ok {
63 return newKey, value
64 }
65 return key, value
66 })
67 }
68 69 // Checks if a string slice contains a string
70 func contains(s []string, e string) bool {
71 for _, a := range s {
72 if a == e {
73 return true
74 }
75 }
76 return false
77 }
78