gitee.com/zhongguo168a/gocodes@v0.0.0-20230609140523-e1828349603f/datax/versionx/cachez-object-version.go (about) 1 package versionx 2 3 import ( 4 "gitee.com/zhongguo168a/gocodes/datax" 5 "gitee.com/zhongguo168a/gocodes/datax/mapx" 6 ) 7 8 // 输出变化的字段 9 func (s *Object) ToMapVersion() (r datax.M) { 10 r = datax.M{} 11 if s.enableVersion { 12 s.toMapVersion(r) 13 s.RefVersionComplete() 14 } else { 15 s.toMap(r) 16 } 17 18 return 19 } 20 func (s *Object) toMapVersion(target datax.M) { 21 versions := s.RefVersions() 22 lastVersion := s.lastVersion 23 for field, val := range s.data { 24 key := s.RefFieldPath() + "/" + field 25 if versions[key] <= lastVersion { 26 continue 27 } 28 switch v := val.(type) { 29 case datax.M: 30 if v != nil { 31 tm := datax.M{} 32 target[field] = tm 33 s.RefClass(field).toMapVersion(tm) 34 } 35 default: 36 target[field] = v 37 } 38 } 39 } 40 41 // 输出所有字段 42 func (s *Object) ToMap() (r datax.M) { 43 r = datax.M{} 44 s.toMap(r) 45 return 46 } 47 48 func (s *Object) toMap(target datax.M) { 49 for field, val := range s.data { 50 switch v := val.(type) { 51 case datax.M: 52 if v != nil { 53 tm := datax.M{} 54 target[field] = tm 55 s.RefClass(field).toMap(tm) 56 } 57 default: 58 target[field] = v 59 } 60 } 61 } 62 63 // 输出指定字段 64 func (s *Object) ToMapByField(fieldMap datax.M) (r datax.M) { 65 r = datax.M{} 66 toMapByField(s.data, fieldMap, r) 67 return r 68 } 69 70 func toMapByField(data, fieldMap datax.M, r datax.M) { 71 for field, fieldValue := range fieldMap { 72 dataVal := data[field] 73 switch v := dataVal.(type) { 74 case datax.M: 75 if v != nil { 76 tm := datax.M{} 77 r[field] = tm 78 if fieldValue == nil { 79 mapx.Copy(v, tm) 80 } else { 81 toMapByField(v, fieldValue.(datax.M), tm) 82 } 83 } else { 84 r[field] = nil 85 } 86 default: 87 r[field] = v 88 } 89 } 90 return 91 } 92 func toMapByData(data, fieldMap datax.M, r datax.M) { 93 for field, fieldValue := range fieldMap { 94 dataVal := data[field] 95 switch v := dataVal.(type) { 96 case datax.M: 97 if v != nil { 98 tm := datax.M{} 99 r[field] = tm 100 if fieldValue == nil { 101 } else { 102 toMapByField(v, fieldValue.(datax.M), tm) 103 } 104 } else { 105 r[field] = nil 106 } 107 default: 108 r[field] = v 109 } 110 } 111 return 112 }