fix both modify
This commit is contained in:
		| @ -14,7 +14,6 @@ import ( | ||||
| 	"strings" | ||||
|  | ||||
| 	"git.zhangdeman.cn/zhangdeman/gopkg/util" | ||||
|  | ||||
| 	"github.com/pkg/errors" | ||||
|  | ||||
| 	"github.com/tidwall/gjson" | ||||
| @ -76,17 +75,6 @@ func (df *DataFilter) Filter() (string, error) { | ||||
| 	// 创建数据的根结点 | ||||
| 	jsonObject = gabs.New() | ||||
| 	for _, item := range df.filterRule { | ||||
| 		if df.pathIsArrayValue(item.SourceKey) { | ||||
| 			// 数组, 特殊处理 | ||||
| 			// 0. 判断目标路径是否为数组 | ||||
| 			// 1. 判断数据源数组深度与目标数组深度是否一致 | ||||
| 			sourcePathArr := strings.Split(item.SourceKey, ".[].") | ||||
| 			mapPathArr := strings.Split(item.MapKey, ".[].") | ||||
| 			if len(sourcePathArr) != len(mapPathArr) { | ||||
| 				// return "", errors.New("slice转化原始数据深度与目标数据深度不一致") | ||||
| 			} | ||||
| 			continue | ||||
| 		} | ||||
| 		// 数据源路径不识数组, 多个key写入到同一个map key, 并且map key 不是以[]结尾, 自动格式化 | ||||
| 		// 目标位置, 是一个数组 | ||||
| 		if df.pathIsArrayValue(item.MapKey) { | ||||
| @ -140,7 +128,11 @@ func (df *DataFilter) UserItemToSlice() { | ||||
| // | ||||
| // Date : 2022/1/23 12:45 AM | ||||
| func (df *DataFilter) getValueType(valueResult gjson.Result) string { | ||||
| 	dataType := reflect.TypeOf(valueResult.Value()).String() | ||||
| 	dataTypeVal := reflect.TypeOf(valueResult.Value()) | ||||
| 	if nil == dataTypeVal { | ||||
| 		return "NIL" | ||||
| 	} | ||||
| 	dataType := dataTypeVal.String() | ||||
| 	if strings.Contains(dataType, "int") { | ||||
| 		return "int64" | ||||
| 	} | ||||
| @ -180,8 +172,11 @@ func (df *DataFilter) formatRule() { | ||||
| 					continue | ||||
| 				} | ||||
| 				// 数组层级深度不同,重新对对齐数据 | ||||
| 				diffArr := sourcePathArr[0 : len(sourcePathArr)-len(mapPathArr)-1] | ||||
| 				df.dealDiffArr(diffArr, sourcePathArr[len(sourcePathArr)-len(mapPathArr)-1:], mapPathArr) | ||||
| 				diffArr := sourcePathArr[0 : len(sourcePathArr)-len(mapPathArr)+1] | ||||
| 				if newPath := df.dealDiffArr(diffArr, sourcePathArr[len(sourcePathArr)-len(mapPathArr)-1:], mapPathArr); len(newPath) > 0 { | ||||
| 					sourcePathArr[len(sourcePathArr)-len(mapPathArr)] = newPath | ||||
| 					item.SourceKey = strings.Join(sourcePathArr[len(sourcePathArr)-len(mapPathArr):], ".[].") | ||||
| 				} | ||||
| 			} | ||||
| 		} else { | ||||
| 			if df.pathIsArrayValue(item.MapKey) { | ||||
| @ -207,20 +202,20 @@ func (df *DataFilter) formatRule() { | ||||
| // Author : go_developer@163.com<白茶清欢> | ||||
| // | ||||
| // Date : 5:04 下午 2022/1/25 | ||||
| func (df *DataFilter) dealDiffArr(diffArr []string, sourceAfterArr []string, mapArr []string) { | ||||
| func (df *DataFilter) dealDiffArr(diffArr []string, sourceAfterArr []string, mapArr []string) string { | ||||
| 	if len(diffArr) == 0 { | ||||
| 		return "" | ||||
| 	} | ||||
| 	diffArrStr := strings.Join(diffArr, ".[].") | ||||
| 	if _, exist := df.hasDealDiffPath[diffArrStr]; exist { | ||||
| 		// 已经处理过, 不再重复处理 | ||||
| 		return | ||||
| 	} | ||||
| 	if len(diffArr) == 0 { | ||||
| 		return | ||||
| 		return df.hasDealDiffPath[diffArrStr] | ||||
| 	} | ||||
|  | ||||
| 	// 没处理过, 开始处理 | ||||
| 	jsonResultList := df.getArrayData(df.source, diffArr) | ||||
| 	if len(jsonResultList) == 0 { | ||||
| 		return | ||||
| 		return "" | ||||
| 	} | ||||
| 	newPath := util.GenRandomString("", 8) | ||||
| 	var result map[string]interface{} | ||||
| @ -234,6 +229,8 @@ func (df *DataFilter) dealDiffArr(diffArr []string, sourceAfterArr []string, map | ||||
| 	} | ||||
|  | ||||
| 	df.source = JSONObject.String() | ||||
| 	df.hasDealDiffPath[diffArrStr] = newPath | ||||
| 	return newPath | ||||
| } | ||||
|  | ||||
| // getArrayData 获取数据 | ||||
| @ -248,7 +245,7 @@ func (df *DataFilter) getArrayData(source string, pathArr []string) []gjson.Resu | ||||
| 	resultList := make([]gjson.Result, 0) | ||||
| 	dataList := gjson.Get(source, pathArr[0]).Array() | ||||
| 	for idx := 0; idx < len(dataList); idx++ { | ||||
| 		resultList = append(resultList, df.getArrayData(gjson.Get(source, dataList[idx].String()).String(), pathArr[1:])...) | ||||
| 		resultList = append(resultList, df.getArrayData(dataList[idx].String(), pathArr[1:])...) | ||||
| 	} | ||||
| 	return resultList | ||||
| } | ||||
|  | ||||
| @ -267,7 +267,7 @@ func TestDataFilterDiffArr(t *testing.T) { | ||||
| 	rule := []*FilterDataRule{ | ||||
| 		// {SourceKey: "name", MapKey: "slice.[]", DefaultValue: "用户姓名默认值"}, | ||||
| 		{SourceKey: "table.[].user_list.[].name", MapKey: "user_list.[].detail.name", DefaultValue: "用户姓名默认值"}, | ||||
| 		{SourceKey: "table.[].user_list.[].age", MapKey: "user_list.[]detail.age", DefaultValue: "用户姓名默认值"}, | ||||
| 		{SourceKey: "table.[].user_list.[].age", MapKey: "user_list.[].detail.age", DefaultValue: "用户姓名默认值"}, | ||||
| 	} | ||||
| 	byteData, _ := json.Marshal(source) | ||||
| 	filter := NewDataFilter(string(byteData), rule) | ||||
|  | ||||
		Reference in New Issue
	
	Block a user