@@ -141,54 +141,51 @@ func (token *unionToken) getUnionByKey(obj interface{}, keys []string) ([]interf
141
141
return nil , getInvalidTokenTargetNilError (token .Type (), reflect .Map )
142
142
}
143
143
144
- keyMap := make (map [string ]bool )
145
- for _ , key := range keys {
146
- keyMap [key ] = true
147
- }
148
-
149
144
switch objType .Kind () {
150
145
case reflect .Map :
151
146
mapKeys := objVal .MapKeys ()
152
147
sortMapKeys (mapKeys )
153
148
154
149
elements := make ([]interface {}, 0 )
155
150
151
+ keysMap := make (map [string ]reflect.Value )
156
152
for _ , key := range mapKeys {
157
- if keyMap [key .String ()] {
158
- delete (keyMap , key .String ())
153
+ keysMap [key .String ()] = key
154
+ }
155
+
156
+ missingKeys := make ([]string , 0 )
157
+
158
+ for _ , requestedKey := range keys {
159
+ if key , ok := keysMap [requestedKey ]; ok {
159
160
elements = append (elements , objVal .MapIndex (key ).Interface ())
161
+ } else {
162
+ missingKeys = append (missingKeys , requestedKey )
160
163
}
161
164
}
162
165
163
- if len (keyMap ) > 0 {
164
- remaining := make ([]string , 0 )
165
- for key := range keyMap {
166
- remaining = append (remaining , key )
167
- }
168
- sort .Strings (remaining )
169
- return nil , getInvalidTokenKeyNotFoundError (token .Type (), strings .Join (remaining , "," ))
166
+ if len (missingKeys ) > 0 {
167
+ sort .Strings (missingKeys )
168
+ return nil , getInvalidTokenKeyNotFoundError (token .Type (), strings .Join (missingKeys , "," ))
170
169
}
171
170
172
171
return elements , nil
173
172
case reflect .Struct :
174
173
elements := make ([]interface {}, 0 )
175
174
176
- mapKeys := getStructFields (objVal , false )
175
+ keysMap := getStructFields (objVal , false )
176
+ missingKeys := make ([]string , 0 )
177
177
178
- for key , field := range mapKeys {
179
- if keyMap [key ] {
180
- delete (keyMap , key )
178
+ for _ , requestedKey := range keys {
179
+ if field , ok := keysMap [requestedKey ]; ok {
181
180
elements = append (elements , objVal .FieldByName (field .Name ).Interface ())
181
+ } else {
182
+ missingKeys = append (missingKeys , requestedKey )
182
183
}
183
184
}
184
185
185
- if len (keyMap ) > 0 {
186
- remaining := make ([]string , 0 )
187
- for key := range keyMap {
188
- remaining = append (remaining , key )
189
- }
190
- sort .Strings (remaining )
191
- return nil , getInvalidTokenKeyNotFoundError (token .Type (), strings .Join (remaining , "," ))
186
+ if len (missingKeys ) > 0 {
187
+ sort .Strings (missingKeys )
188
+ return nil , getInvalidTokenKeyNotFoundError (token .Type (), strings .Join (missingKeys , "," ))
192
189
}
193
190
194
191
return elements , nil
0 commit comments