@@ -141,54 +141,51 @@ func (token *unionToken) getUnionByKey(obj interface{}, keys []string) ([]interf
141141 return nil , getInvalidTokenTargetNilError (token .Type (), reflect .Map )
142142 }
143143
144- keyMap := make (map [string ]bool )
145- for _ , key := range keys {
146- keyMap [key ] = true
147- }
148-
149144 switch objType .Kind () {
150145 case reflect .Map :
151146 mapKeys := objVal .MapKeys ()
152147 sortMapKeys (mapKeys )
153148
154149 elements := make ([]interface {}, 0 )
155150
151+ keysMap := make (map [string ]reflect.Value )
156152 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 {
159160 elements = append (elements , objVal .MapIndex (key ).Interface ())
161+ } else {
162+ missingKeys = append (missingKeys , requestedKey )
160163 }
161164 }
162165
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 , "," ))
170169 }
171170
172171 return elements , nil
173172 case reflect .Struct :
174173 elements := make ([]interface {}, 0 )
175174
176- mapKeys := getStructFields (objVal , false )
175+ keysMap := getStructFields (objVal , false )
176+ missingKeys := make ([]string , 0 )
177177
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 {
181180 elements = append (elements , objVal .FieldByName (field .Name ).Interface ())
181+ } else {
182+ missingKeys = append (missingKeys , requestedKey )
182183 }
183184 }
184185
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 , "," ))
192189 }
193190
194191 return elements , nil
0 commit comments