// Package op_array ... // // Description : wrapper ... // // Author : go_developer@163.com<白茶清欢> // // Date : 2023-06-11 21:02 package op_array import ( "encoding/json" "reflect" "strings" "git.zhangdeman.cn/zhangdeman/op_type" "git.zhangdeman.cn/zhangdeman/wrapper/define" "git.zhangdeman.cn/zhangdeman/wrapper/op_any" "github.com/tidwall/gjson" ) // ArrayType 数组实例 func ArrayType[Bt op_type.BaseType](value []Bt) *Array[Bt] { at := &Array[Bt]{ value: value, } return at } // Array ... type Array[Bt op_type.BaseType] struct { value []Bt convertErr error itemType reflect.Kind // 简单list场景下, 每一项的数据类型 } // IsNil 输入是否为nil func IsNil[BaseType op_type.BaseType](arr Array[BaseType]) bool { return arr.value == nil } // ToStringSlice ... func ToStringSlice[BaseType op_type.BaseType](arr Array[BaseType]) []string { list := make([]string, 0) for _, item := range arr.value { str := op_any.AnyDataType(item).ToString() list = append(list, str) } return list } // Unique 对数据结果进行去重 func Unique[BaseType op_type.BaseType](arr Array[BaseType]) []BaseType { result := make([]BaseType, 0) dataTable := make(map[string]bool) for _, item := range arr.value { byteData, _ := json.Marshal(item) k := string(byteData) if strings.HasPrefix(k, "\"\"") && strings.HasSuffix(k, "\"\"") { k = string(byteData[1 : len(byteData)-1]) } if _, exist := dataTable[k]; exist { continue } dataTable[k] = true result = append(result, item) } return result } // Has 查询一个值是否在列表里, 在的话, 返回首次出现的索引, 不在返回-1 func Has[BaseType op_type.BaseType](arr Array[BaseType], input BaseType) int { for idx := 0; idx < len(arr.value); idx++ { if reflect.TypeOf(arr.value[idx]).String() != reflect.TypeOf(input).String() { // 类型不同 continue } sourceByte, _ := json.Marshal(arr.value[idx]) inputByte, _ := json.Marshal(input) if string(sourceByte) != string(inputByte) { continue } return idx } return -1 } // ToString ... func ToString[BaseType op_type.BaseType](arr Array[BaseType]) define.BaseValueResult[string] { if IsNil(arr) { return define.BaseValueResult[string]{ Value: "", Err: nil, } } byteData, err := json.Marshal(arr.value) return define.BaseValueResult[string]{ Value: string(byteData), Err: err, } } // ToStringWithSplit 数组按照指定分隔符转为字符串 func ToStringWithSplit[BaseType op_type.BaseType](arr Array[BaseType], split string) define.BaseValueResult[string] { if IsNil(arr) { return define.BaseValueResult[string]{ Value: "", Err: nil, } } return define.BaseValueResult[string]{ Value: strings.Join(ToStringSlice(arr), split), Err: nil, } } // ExtraField 提取[]map/[]struct 中的指定字段, 并以list形式返回 func ExtraField[BaseType op_type.BaseType](arr Array[BaseType], fieldName string) string { if IsNil(arr) { return "[]" } byteData, _ := json.Marshal(arr.value) res := make([]any, 0) list := gjson.ParseBytes(byteData).Array() for _, item := range list { itemValue := item.Get(fieldName) if itemValue.Exists() { res = append(res, itemValue.Value()) } } return ToString(arr).Value }