https://github.com/Asa-gc/SUTL/blob/main/src/qml/func/MyJson/MyJson.js
QML里的json相关操作只能对子对象进行操作,无法对子对象的子对象进行直接操作,故想写几个函数可以直接对其进行操作
辅助函数,补充 qml typeof()
对数组和对象都返回 object的问题
function typeObj(obj){
var type=Object.prototype.toString.call(obj);
if(type==="[object Array]"){
return "array"
}else if(type==="[object Object]"){
return "object"
}else{
return typeof(obj)
}
}
一.查找操作
其它操作基本都会需要用到该操作,故先行实现.
1.需求点:
2.实现
2.1 function findMemberValue(_json,_key,_index)
查找第一个碰到的符合要求的值.
_json
为需要操作的json对象
_key
为查找的键值
_index
用于当键为_key的元素为数组时,取得数组内对应索引的值,可省略,省略时直接返回整个数组.
function findMemberValue(_json,_key,_index){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("_json is not json object or array!")
return
}
if(_key===undefined){
console.log("_key undefined!")
return}
var index=Object.keys(_json).indexOf(_key.toString())
if(index>=0){//找到
if(_index!==undefined){
return Object.values(_json)[index][_index]
}
return Object.values(_json)[index]
}
var valuelist=Object.values(_json)
// console.log(valuelist)
var res=undefined
for(let ov in valuelist){
// console.log(typeObj(valuelist[ov]),valuelist[ov])
if(typeObj(valuelist[ov])==="object"||
typeObj(valuelist[ov])==="array"){
res= findMemberValue(valuelist[ov],_key,_index)
if(res!==undefined){
return res
}
}
}
return
}
2.2 function findMemberValueEx(_json,_conditions,_index)
根据条件值查找对应的值
_json
为需要操作的json对象
_conditions
为查找的条件值数组或单个key.单个key时,和2.1等同;数组时,会按照条件递归的查找对象,返回对应的值,逻辑为,把_conditions[0]作为_key查找符合的对象,在该对象上使用_conditions[1]作为_key再次查找,依次类推,直到找到符合整个_conditions的对象.
_index
用于当键为_key的元素为数组时,取得数组内对应索引的值,可省略,省略时直接返回整个数组.
function findMemberValueEx(_json,_conditions,_index){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("Ex _json is not json object or array!")
return
}
var tobj=_json;
if(typeObj(_conditions)==="object"||typeObj(_conditions)==="array"){
for(let i in _conditions){
tobj=findMemberValue(tobj,_conditions[i.toString()])
if(tobj===undefined){
return
}
}
}else{
tobj=findMemberValue(tobj,_conditions)
}
if(_index!==undefined){
tobj=tobj[_index]
}
return tobj
}
二.修改操作
基于查找的逻辑,找到对应的值进行修改
1.需求点:
2.实现
2.1 function setMemberValue(_json,_key,_value,_index)
查找第一个碰到的符合要求的对象,并修改其值
_json
为需要操作的json对象
_key
为需要修改对象的键值
_value
为修改值
_index
用于当键为_key的元素为数组时,取得数组内对应索引的值,可省略,省略时直接修改整个数组.
function setMemberValue(_json,_key,_value,_index){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("_json is not json object or array!")
return undefined
}
var index=Object.keys(_json).indexOf(_key.toString())
// console.log(_key ,index)
var tindex=Object.keys(_json).indexOf(_key)
// console.log(_key ,tindex)
if(_key===undefined){return undefined}
if(index>=0){//找到
if(_index!==undefined){
_json[_key][_index]=_value
return 1
}
_json[_key]=_value
return 2
}
var valuelist=Object.values(_json)
// console.log(valuelist)
var res=undefined
for(let ov in valuelist){
// console.log(typeObj(valuelist[ov]),valuelist[ov])
if(typeObj(valuelist[ov])==="object"||
typeObj(valuelist[ov])==="array"){
res= setMemberValue(valuelist[ov],_key,_value,_index)
if(res!==undefined){
return res
}
}
}
return undefined
}
2.2 function setMemberValueEx(_json,_key,_value,_conditions,_index)
根据条件值查找需要修改的对象,修改其值
_json
为需要操作的json对象
_key
为需要修改对象的键值
_value
为修改值
_conditions
为查找的条件值数组或单个key.单个key时,和2.1等同;数组时,会按照条件递归的查找对象,返回对应的值,逻辑为,把_conditions[0]作为_key查找符合的对象,在该对象上使用_conditions[1]作为_key再次查找,依次类推,直到找到符合整个_conditions的对象.
PS:根据 _conditions
查找到的值必须是对象或者数组,才可以,原因是qml里不同数据类型有不同传值方式,对象和数组是引用传递,可实现修改原json对象,如果是string,number一类的,修改不会在原json对象生效.
_index
用于当键为_key的元素为数组时,取得数组内对应索引的值,可省略,省略时直接返回整个数组.
function setMemberValueEx(_json,_key,_value,_conditions,_index){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("_json is not json object or array!")
return
}
var tobj=_json;
if(_conditions !==undefined){
tobj=findMemberValueEx(tobj,_conditions)
if(typeObj(tobj)!=="object"&&typeObj(tobj)!=="array"){
console.log("tobj is not json object or array!")
return
}
}
// console.log(tobj,_key,_value,_index)
return setMemberValue(tobj,_key,_value,_index)
}
三.增加操作
基于查找的逻辑,找到对应的对象,并为其增加新项
1.需求点:
2.实现
2.1 function addMemberValue(_json,_parent,_key,_value)
查找第一个找到的符合要求的对象,并为其添加新项,该对象须为对象或数组.
_json
为需要操作的json对象
_parent
为增加对象的键值
_key
为增加对象的键值.当parent为数组时该值被忽略
_value
为增加对象的值
function addMemberValue(_json,_parent,_key,_value){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("_json is not json object or array!")
return undefined
}
if(_key===undefined){return undefined}
if(_parent===undefined||_parent===""){
_json[_key]=_value;
return 1;
}
var index=Object.keys(_json).indexOf(_parent.toString())
if(index>=0){//找到
if(typeObj(_json[_parent])==="array"){//数组
_json[_parent].push(_value)
return 1
}
//对象
_json[_parent][_key]=_value
return 2
}
var valuelist=Object.values(_json)
// console.log(valuelist)
var res=undefined
for(let ov in valuelist){
// console.log(typeObj(valuelist[ov]),valuelist[ov])
if(typeObj(valuelist[ov])==="object"||
typeObj(valuelist[ov])==="array"){
res= addMemberValue(valuelist[ov],_parent,_key,_value)
if(res!==undefined){
return res
}
}
}
return undefined
}
2.2 function addMemberValueEx(_json,_parent,_key,_value,_conditions)
根据条件值查找对象,并为其添加新项,该对象须为对象或数组.为数组新增项时,总是添加到最后
_json
为需要操作的json对象
_parent
为增加对象的键值
_key
为增加对象的键值.当parent为数组时该值被忽略
_value
为增加对象的值
_conditions
为查找的条件值数组或单个key.单个key时,和2.1等同;数组时,会按照条件递归的查找对象,返回对应的值,逻辑为,把_conditions[0]作为_key查找符合的对象,在该对象上使用_conditions[1]作为_key再次查找,依次类推,直到找到符合整个_conditions的对象.
PS:根据 _conditions
查找到的值必须是对象或者数组,才可以,原因是qml里不同数据类型有不同传值方式,对象和数组是引用传递,可实现修改原json对象,如果是string,number一类的,修改不会在原json对象生效.
function addMemberValueEx(_json,_parent,_key,_value,_conditions){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("_json is not json object or array!")
return
}
var tobj=_json;
var ret=undefined
if(_conditions !==undefined){
tobj=findMemberValueEx(tobj,_conditions)
if(typeObj(tobj)!=="object"&&typeObj(tobj)!=="array"){
return
}
}
return addMemberValue(tobj,_parent,_key,_value)
}
四.删除操作
基于查找的逻辑,找到对应的对象并删除
1.需求点:
2.实现
2.1 function removeMemberValue(_json,_key,_index)
查找第一个碰到的符合要求的对象,并删除
_json
为需要操作的json对象
_key
为需要删除对象的键值
_index
用于当键为_key的元素为数组时删除数组内对应索引的值,可省略,省略时直接删除整个数组.
function removeMemberValue(_json,_key,_index){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("_json is not json object or array!")
return undefined
}
if(_key===undefined){return undefined}
var index=Object.keys(_json).indexOf(_key.toString())
if(index>=0){//找到
if(_index!==undefined){
_json[_key][_index]=undefined
if(typeObj(_json[_key])==="array"){
_json[_key].splice(_index,1)
}
return 1
}
_json[_key]=undefined
return 2
}
var valuelist=Object.values(_json)
// console.log(valuelist)
var res=undefined
for(let ov in valuelist){
// console.log(typeObj(valuelist[ov]),valuelist[ov])
if(typeObj(valuelist[ov])==="object"||
typeObj(valuelist[ov])==="array"){
res= removeMemberValue(valuelist[ov],_key,_index)
if(res!==undefined){
return res
}
}
}
return undefined
}
2.2 function removeMemberValueEx(_json,_key,_conditions,_index)
根据条件值查找需要删除的对象并删除
_json
为需要操作的json对象
_key
为需要删除对象的键值
_conditions
为查找的条件值数组或单个key.单个key时,和2.1等同;数组时,会按照条件递归的查找对象,返回对应的值,逻辑为,把_conditions[0]作为_key查找符合的对象,在该对象上使用_conditions[1]作为_key再次查找,依次类推,直到找到符合整个_conditions的对象.
PS:根据 _conditions
查找到的值必须是对象或者数组,才可以,原因是qml里不同数据类型有不同传值方式,对象和数组是引用传递,可实现修改原json对象,如果是string,number一类的,修改不会在原json对象生效.
_index
用于当键为_key的元素为数组时,删除数组内对应索引的值,可省略,省略时直接删除整个数组.
function removeMemberValueEx(_json,_key,_conditions,_index){
if(typeObj(_json)!=="object"&&typeObj(_json)!=="array"){
console.log("_json is not json object or array!")
return
}
var tobj=_json;
if(_conditions !==undefined){
tobj=findMemberValueEx(tobj,_conditions)
// console.log(tobj)
if(typeObj(tobj)!=="object"&&typeObj(tobj)!=="array"){
return
}
}
return removeMemberValue(tobj,_key,_index)
}
五.test
function testMyJson(){
var json ={
"a0":0,
"b0":{"a1":1},
"c0":{"b1":{"a2":2,"b2":3},"c1":4},
"d0":{"b1":{"a2":12,"b2":13},"c1":14},
"e0":[0,1,2,3,4],
"f0":{"e1":[0,1,2,3,4],"f1":4},
"g0":{"g1":[[0,1,2,3,4],
[10,11,12,13,14],
[20,21,22,23,24],
[30,31,32,33,34],
[40,41,42,43,44]
],"f1":4},
"h0":{"h1":[{"c2":0,"d2":1},
{"c2":10,"d2":11},
{"c2":20,"d2":21},
{"c2":30,"d2":31},]},
}
console.log(JSON.stringify(json))
console.log("*******************************")
console.log(">>>>>Find MemBer Value<<<<<")
console.log("findMemberValue(a0):" ,findMemberValue(json,"a0"));
console.log("findMemberValue(b2):" ,findMemberValue(json,"b2"));
console.log("findMemberValueEx(d0->b2):" ,findMemberValueEx(json,["d0","b2"]));
console.log("findMemberValue(e0[3]):" ,findMemberValue(json,"e0",3));
console.log("findMemberValue(e1[3]):" ,findMemberValue(json,"e1",3));
console.log("findMemberValueEx(g1[3][2])1:" ,findMemberValueEx(json,["g1",3],2));
console.log("findMemberValueEx(g1[3][2])2:" ,findMemberValueEx(json,["g1",3,2]));
console.log("findMemberValue(d2):" ,findMemberValue(json,"d2"));
console.log("findMemberValueEx(h1[1]->d2):" ,findMemberValueEx(json,["h1",1,"d2"]));
console.log("*******************************")
console.log(">>>>>Set MemBer Value<<<<<")
console.log("setMemberValue(a0) res:" ,setMemberValue(json,"a0",111));
console.log("setMemberValue(a0) json:" ,JSON.stringify(json));
console.log("setMemberValue(b2):" ,setMemberValue(json,"b2",111));
console.log("setMemberValue(b2) json:" ,JSON.stringify(json));
console.log("setMemberValueEx(d0->b2):" ,setMemberValueEx(json,"b2",111,["d0"]));
console.log("setMemberValueEx(d0->b2) json:" ,JSON.stringify(json));
console.log("setMemberValue(e0[3]):" ,setMemberValue(json,"e0",111,3));
console.log("setMemberValue(e0[3]) json:" ,JSON.stringify(json));
console.log("setMemberValue(e1[3]):" ,setMemberValue(json,"e1",111,3));
console.log("setMemberValue(e1[3]) json:" ,JSON.stringify(json));
console.log("setMemberValueEx(e1[3]):" ,setMemberValueEx(json,"e1",222,null,3));
console.log("setMemberValueEx(e1[3]) json:" ,JSON.stringify(json));
console.log("setMemberValueEx(g1[3][2])):" ,setMemberValueEx(json,2,111,["g1",3]));
console.log("setMemberValueEx(g1[3][2])) json:" ,JSON.stringify(json));
console.log("setMemberValue(d2):" ,setMemberValue(json,"d2",111));
console.log("setMemberValue(d2) json:" ,JSON.stringify(json));
console.log("setMemberValueEx(h1[1]->d2):" ,setMemberValueEx(json,"d2",111,["h1",2]));
console.log("setMemberValueEx(h1[1]->d2)) json:" ,JSON.stringify(json));
console.log("*******************************")
console.log(">>>>>Add MemBer Value<<<<<")
console.log("addMemberValue() res:" ,addMemberValue(json,"","z1",666));
console.log("addMemberValue() json:" ,JSON.stringify(json));
console.log("addMemberValue(b1) res:" ,addMemberValue(json,"b1","z1",666));
console.log("addMemberValue(b1) json:" ,JSON.stringify(json));
console.log("addMemberValueEx(d0->b1) res:" ,addMemberValueEx(json,"b1","z1",666,["d0"]));
console.log("addMemberValueEx(d0->b1) json:" ,JSON.stringify(json));
console.log("addMemberValue(e0) res:" ,addMemberValue(json,"e0","z1",666));
console.log("addMemberValue(e0) json:" ,JSON.stringify(json));
console.log("addMemberValue(e1) res:" ,addMemberValue(json,"e1","z1",666));
console.log("addMemberValue(e1) json:" ,JSON.stringify(json));
console.log("addMemberValueEx(g1[3]) res:" ,addMemberValueEx(json,3,"z1",666,["g1"]));
console.log("addMemberValueEx(g1[3]) json:" ,JSON.stringify(json));
console.log("addMemberValueEx(h1[2])1 res:" ,addMemberValueEx(json,2,"z1",666,["h1"]));
console.log("addMemberValueEx(h1[2])1 json:" ,JSON.stringify(json));
console.log("addMemberValueEx(h1[2])2 res:" ,addMemberValueEx(json,"","z1",666,["h1",2]));
console.log("addMemberValueEx(h1[2])2 json:" ,JSON.stringify(json));
console.log("*******************************")
console.log(">>>>>Remove MemBer Value<<<<<")
console.log("removeMemberValue() res:" ,removeMemberValue(json,"z1"));
console.log("removeMemberValue() json:" ,JSON.stringify(json));
console.log("removeMemberValueEx(d0->z1) res:" ,removeMemberValueEx(json,"z1",["d0"]));
console.log("removeMemberValueEx(d0->z1) json:" ,JSON.stringify(json));
console.log("removeMemberValue(e0[5]) res:" ,removeMemberValue(json,"e0",5));
console.log("removeMemberValue(e0[5]) json:" ,JSON.stringify(json));
console.log("removeMemberValue(e1[5]) res:" ,removeMemberValue(json,"e1",5));
console.log("removeMemberValue(e1[5]) json:" ,JSON.stringify(json));
console.log("removeMemberValueEx(g1[3][5]) res:" ,removeMemberValueEx(json,3,["g1"],5));
console.log("removeMemberValueEx(g1[3][5]) json:" ,JSON.stringify(json));
console.log("removeMemberValueEx(h1[2]->z1) res:" ,removeMemberValueEx(json,"z1",["h1",2]));
console.log("removeMemberValueEx(h1[2]->z1) json:" ,JSON.stringify(json));
}
https://github.com/Asa-gc/SUTL/blob/main/src/qml/func/MyJson/MyJson.js