数组支持提取指定路径字段, 转换成list

This commit is contained in:
白茶清欢 2024-08-06 16:03:12 +08:00
parent 3533617196
commit 50aa5ae7f8
3 changed files with 76 additions and 12 deletions

2
any.go
View File

@ -97,7 +97,7 @@ func (at *AnyType) ToString() String {
case consts.DataTypeSliceAny: case consts.DataTypeSliceAny:
var val []any var val []any
_ = serialize.JSON.Transition(at.data, &val) _ = serialize.JSON.Transition(at.data, &val)
return String(ArrayType[any](val).ToString().Value) return String(ArrayType[any, any](val).ToString().Value)
case consts.DataTypeMapAnyAny: case consts.DataTypeMapAnyAny:
return String(EasyMap(at.data).ToString()) return String(EasyMap(at.data).ToString())
case consts.DataTypeInt: case consts.DataTypeInt:

View File

@ -9,7 +9,9 @@ package wrapper
import ( import (
"encoding/json" "encoding/json"
"errors"
"git.zhangdeman.cn/zhangdeman/op_type" "git.zhangdeman.cn/zhangdeman/op_type"
"github.com/tidwall/gjson"
"reflect" "reflect"
"strings" "strings"
) )
@ -19,8 +21,8 @@ import (
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:03 2023/6/11 // Date : 21:03 2023/6/11
func ArrayType[Bt op_type.BaseType](value []Bt) *Array[Bt] { func ArrayType[Bt op_type.BaseType, ExtractDataType op_type.BaseType](value []Bt) *Array[Bt, ExtractDataType] {
at := &Array[Bt]{ at := &Array[Bt, ExtractDataType]{
value: value, value: value,
} }
return at return at
@ -31,7 +33,7 @@ func ArrayType[Bt op_type.BaseType](value []Bt) *Array[Bt] {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:05 2023/6/11 // Date : 21:05 2023/6/11
type Array[Bt op_type.BaseType] struct { type Array[Bt op_type.BaseType, ExtractDataType op_type.BaseType] struct {
value []Bt value []Bt
convertErr error convertErr error
itemType reflect.Kind // 简单list场景下, 每一项的数据类型 itemType reflect.Kind // 简单list场景下, 每一项的数据类型
@ -42,7 +44,7 @@ type Array[Bt op_type.BaseType] struct {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 21:11 2023/6/11 // Date : 21:11 2023/6/11
func (at *Array[Bt]) IsNil() bool { func (at *Array[Bt, ExtractDataType]) IsNil() bool {
return at.value == nil return at.value == nil
} }
@ -51,7 +53,7 @@ func (at *Array[Bt]) IsNil() bool {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 11:42 2024/4/22 // Date : 11:42 2024/4/22
func (at *Array[Bt]) ToStringSlice() []string { func (at *Array[Bt, ExtractDataType]) ToStringSlice() []string {
list := make([]string, 0) list := make([]string, 0)
for _, item := range at.value { for _, item := range at.value {
byteData, _ := json.Marshal(item) byteData, _ := json.Marshal(item)
@ -65,7 +67,7 @@ func (at *Array[Bt]) ToStringSlice() []string {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 17:43 2023/6/12 // Date : 17:43 2023/6/12
func (at *Array[Bt]) Unique() []Bt { func (at *Array[Bt, ExtractDataType]) Unique() []Bt {
result := make([]Bt, 0) result := make([]Bt, 0)
dataTable := make(map[string]bool) dataTable := make(map[string]bool)
@ -90,7 +92,7 @@ func (at *Array[Bt]) Unique() []Bt {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 16:28 2023/7/31 // Date : 16:28 2023/7/31
func (at *Array[Bt]) Has(input Bt) int { func (at *Array[Bt, ExtractDataType]) Has(input Bt) int {
for idx := 0; idx < len(at.value); idx++ { for idx := 0; idx < len(at.value); idx++ {
if reflect.TypeOf(at.value[idx]).String() != reflect.TypeOf(input).String() { if reflect.TypeOf(at.value[idx]).String() != reflect.TypeOf(input).String() {
// 类型不同 // 类型不同
@ -111,7 +113,7 @@ func (at *Array[Bt]) Has(input Bt) int {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 16:57 2023/9/28 // Date : 16:57 2023/9/28
func (at *Array[Bt]) ToString() StringResult { func (at *Array[Bt, ExtractDataType]) ToString() StringResult {
if at.IsNil() { if at.IsNil() {
return StringResult{ return StringResult{
Value: "", Value: "",
@ -130,7 +132,7 @@ func (at *Array[Bt]) ToString() StringResult {
// Author : go_developer@163.com<白茶清欢> // Author : go_developer@163.com<白茶清欢>
// //
// Date : 17:42 2023/10/25 // Date : 17:42 2023/10/25
func (at *Array[Bt]) ToStringWithSplit(split string) StringResult { func (at *Array[Bt, ExtractDataType]) ToStringWithSplit(split string) StringResult {
if at.IsNil() { if at.IsNil() {
return StringResult{ return StringResult{
Value: "", Value: "",
@ -142,3 +144,47 @@ func (at *Array[Bt]) ToStringWithSplit(split string) StringResult {
Err: nil, Err: nil,
} }
} }
// ExtractField 提取指定字段, 转换成数组
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:24 2024/8/6
func (at *Array[Bt, ExtractDataType]) ExtractField(fieldPath string) ([]ExtractDataType, error) {
strValResult := at.ToString()
if nil != strValResult.Err {
return make([]ExtractDataType, 0), nil
}
gjsonResult := gjson.Parse(strValResult.Value)
if !gjsonResult.IsArray() {
return make([]ExtractDataType, 0), errors.New("input value is not slice")
}
arrList := gjsonResult.Array()
if len(arrList) == 0 {
return make([]ExtractDataType, 0), nil
}
res := make([]ExtractDataType, 0)
for _, item := range arrList {
valueResult := item.Get(fieldPath)
if !valueResult.Exists() {
// 不存在
continue
}
var val ExtractDataType
if err := ConvertAssign(&val, valueResult.String()); nil != err {
return nil, err
}
res = append(res, val)
}
return res, nil
}
// ExtractFieldIgnoreError 提取指定字段并忽略异常
//
// Author : go_developer@163.com<白茶清欢>
//
// Date : 15:28 2024/8/6
func (at *Array[Bt, ExtractDataType]) ExtractFieldIgnoreError(field string) []ExtractDataType {
res, _ := at.ExtractField(field)
return res
}

View File

@ -13,6 +13,24 @@ import (
) )
func TestArray_Unique(t *testing.T) { func TestArray_Unique(t *testing.T) {
fmt.Println(ArrayType([]any{"1", 1, 1, "1", 2, 3}).Unique()) fmt.Println(ArrayType[any, any]([]any{"1", 1, 1, "1", 2, 3}).Unique())
fmt.Println(ArrayType([]int{1, 1, 2, 3}).Unique()) fmt.Println(ArrayType[int, any]([]int{1, 1, 2, 3}).Unique())
}
func TestArray_ExtractField(t *testing.T) {
testMap := []any{
map[string]any{
"age": 18,
"name": "baicha",
},
map[string]any{
"age": 20,
"name": "qinghuan",
},
map[string]any{
"foo": "bar",
},
}
fmt.Println(ArrayType[any, int](testMap).ExtractField("age"))
fmt.Println(ArrayType[any, string](testMap).ExtractField("name"))
} }