// 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 (a *Array[Bt]) IsNil() bool { return a.value == nil } // ToStringSlice ... func (a *Array[Bt]) ToStringSlice() []string { list := make([]string, 0) for _, item := range a.value { str := op_any.AnyDataType(item).ToString() list = append(list, str) } return list } // Unique 对数据结果进行去重 func (a *Array[Bt]) Unique(arr Array[Bt]) []Bt { result := make([]Bt, 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 (a *Array[Bt]) Has(arr Array[Bt], input Bt) 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 (a *Array[Bt]) ToString() define.BaseValueResult[string] { if a.IsNil() { return define.BaseValueResult[string]{ Value: "", Err: nil, } } byteData, err := json.Marshal(a.value) return define.BaseValueResult[string]{ Value: string(byteData), Err: err, } } // ToStringWithSplit 数组按照指定分隔符转为字符串 func (a *Array[Bt]) ToStringWithSplit(arr Array[Bt], split string) define.BaseValueResult[string] { if a.IsNil() { return define.BaseValueResult[string]{ Value: "", Err: nil, } } return define.BaseValueResult[string]{ Value: strings.Join(a.ToStringSlice(), split), Err: nil, } } // ExtraField 提取[]map/[]struct 中的指定字段, 并以list形式返回 func (a *Array[Bt]) ExtraField(fieldName string) string { if a.IsNil() { return "[]" } byteData, _ := json.Marshal(a.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 a.ToString().Value }