1 Star 0 Fork 0

Andrew-M-C/go.jsonvalue

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
delete.go 2.35 KB
一键复制 编辑 原始数据 按行查看 历史
package jsonvalue
import (
"fmt"
"strings"
)
func (v *V) delFromObjectChildren(caseless bool, key string) (exist bool) {
_, exist = v.children.object[key]
if exist {
delete(v.children.object, key)
v.delCaselessKey(key)
return true
}
if !caseless {
return false
}
v.initCaselessStorage()
lowerKey := strings.ToLower(key)
keys, exist := v.children.lowerCaseKeys[lowerKey]
if !exist {
return false
}
for actualKey := range keys {
_, exist = v.children.object[actualKey]
if exist {
delete(v.children.object, actualKey)
v.delCaselessKey(actualKey)
return true
}
}
return false
}
// Delete deletes specified JSON value. Forexample, parameters ("data", "list") identifies deleting value in data.list.
// While ("list", 1) means deleting 2nd (count from one) element from the "list" array.
//
// Delete 从 JSON 中删除参数指定的对象。比如参数 ("data", "list") 表示删除 data.list 值;参数 ("list", 1) 则表示删除 list
// 数组的第2(从1算起)个值。
func (v *V) Delete(firstParam interface{}, otherParams ...interface{}) error {
return v.delete(false, firstParam, otherParams...)
}
func (v *V) delete(caseless bool, firstParam interface{}, otherParams ...interface{}) error {
paramCount := len(otherParams)
if paramCount == 0 {
return v.deleteInCurrValue(caseless, firstParam)
}
child, err := v.get(caseless, firstParam, otherParams[:paramCount-1]...)
if err != nil {
return err
}
// if child == nil {
// return ErrNotFound
// }
return child.delete(caseless, otherParams[paramCount-1])
}
func (v *V) deleteInCurrValue(caseless bool, param interface{}) error {
if v.valueType == Object {
// string expected
key, err := intfToString(param)
if err != nil {
return err
}
if exist := v.delFromObjectChildren(caseless, key); !exist {
return ErrNotFound
}
return nil
}
if v.valueType == Array {
// interger expected
pos, err := intfToInt(param)
if err != nil {
return err
}
pos = v.posAtIndexForRead(pos)
if pos < 0 {
return ErrOutOfRange
}
v.deleteInArr(pos)
return nil
}
// else, this is an object value
return fmt.Errorf("%v type does not supports Delete()", v.valueType)
}
func (v *V) deleteInArr(pos int) {
le := len(v.children.arr)
v.children.arr[pos] = nil
copy(v.children.arr[pos:], v.children.arr[pos+1:])
v.children.arr = v.children.arr[:le-1]
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
Go
1
https://gitee.com/Andrew-M-C/go.jsonvalue.git
git@gitee.com:Andrew-M-C/go.jsonvalue.git
Andrew-M-C
go.jsonvalue
go.jsonvalue
v1.2.1

搜索帮助