js转换luatable格式转成json支持深度转换
2022-12-28 本文已影响0人
yichen_china
var _luaFmt = {
getObjKeys(list) {
var keyobj = {}
var act = 0;
for (let i in list) {
var v = list[i]
for (let i2 in v) {
act = 1
if (!isNaN(i2) && typeof v[i2] == "object") {
act = 2
for (let i3 in v[i2]) {
keyobj[i3] = 1
}
} else {
keyobj[i2] = 1
}
}
}
var keyArr = []
for (let k in keyobj) {
keyArr.push(k)
}
return {
keys: keyArr,
act
}
},
listFmt(list, callback) {
var callback = callback || function(res) {
console.log(res)
}
return new Promise((resolve, reject) => {
var keyArr = _luaFmt.getObjKeys(list).keys
var valArr = []
var isOne = false;
// 判断是一级
for (let i in list) {
if (isNaN(i)) {
isOne = true;
keyArr = ["键", "值"]
break
}
}
var arr = Object.keys(list);
var count = arr.length;
var actionNum = 0
// setProgress(count, actionNum)
callback({
count,
actionNum
})
for (let i in list) {
var v = list[i]
// 如果k是字符串 就判断是一级
if (isNaN(i)) {
// console.log(i)
var val = []
val.push(i)
var val2 = _luaFmt.fmtToStr(v, 1)
val.push(val2)
valArr.push(val)
} else {
// console.log(keyArr)
var isTow = false;
if (!isNaN(i) && typeof v == "object") {
for (let isk in v) {
if (!isNaN(isk) && typeof v[isk] == "object") {
isTow = true
}
break
}
}
// 是二级数组
if (isTow) {
// console.log({i,v})
for (let i3 in v) {
var v2o = v[i3];
var val = []
// console.log({i3,v2o})
keyArr.filter(k => {
var v2 = ""
// console.log({k,v})
if (k in v2o) {
var val2 = _luaFmt.fmtToStr(v2o[k], 1)
// v2 =val2.replace(/'/g, '"');
v2 = val2
// console.log([k,v2o[k]])
}
val.push(v2)
})
valArr.push(val)
}
} else {
var val = []
keyArr.filter(k => {
var v2 = ""
// console.log({k,v})
if (k in v) {
var val2 = _luaFmt.fmtToStr(v[k], 1)
// v2 =val2.replace(/'/g, '"');
v2 = val2
// console.log([k,v2])
}
val.push(v2)
})
valArr.push(val)
}
}
// console.log(count%actionNum===0)
actionNum++
// if(count%actionNum===0){
callback({
count,
num: actionNum
})
// }
// setProgress(count, actionNum * 0.8)
}
resolve({
keys: keyArr,
vals: valArr
})
})
}, // type=1 导出表格字符串不加双引号, type=0 导出配置文本 字符串加双引号
fmtToStr(v, type = 0) {
var v2s = ""
var that = this
if (typeof v == 'object') {
v2s += "{"
if (v instanceof Array) {
var num = 0;
for (let k in v) {
if (num == 0) {
v2s += that.fmtToStr(v[k], type)
} else {
v2s += "," + that.fmtToStr(v[k], type)
}
num++
}
} else {
var num = 0;
for (let k in v) {
var kstr = k
if (k != "" && !isNaN(k)) {
kstr = "[" + k + "]"
}
if (num == 0) {
v2s += kstr + "=" + that.fmtToStr(v[k], type)
} else {
v2s += "," + kstr + "=" + that.fmtToStr(v[k], type)
}
num++
}
}
v2s += "}"
// console.log([v2s,typeof v2,v2])
} else if (v === "" || isNaN(v)) {
// console.log(v)
v = v.replace(/\\n/g, " \\n")
v = v.replace(/\n/g, " \\n")
// console.log("------"+v)
if (type) {
v2s += "'" + v + "'"
// v2s += v
} else {
v2s += '"' + v + '"'
}
} else {
if (!v) {
v = 0;
}
v2s += v
}
return v2s
},
fmtConfig(data) {
var that = this
var e = data;
var r = ""
for (let k in e) {
// var v =(JSON.stringify( e[k])).replace(/:/g,"=")
var v = e[k]
var vs = that.fmtToStr(v)
// console.log(vs)
r += "[" + k + "]= " + vs + ","
// console.log({
// k,
// vs
// })
}
return r
},
confToJson(stringVar) {
str = stringVar
.replace(/EPGP_DB\s=\s/, '') // remove variable definition
// 删除大括号前面的换行空格
.replace(/\s+|\n+(\})/g, '$1') // remove trailing comma
// 删除大括号后面的换行空格
.replace(/(\{)\s+|\n+/g, "$1")
// 删除=前的空格
.replace(/\s\=(.*?)/g, '=$1')
// 删除=后的空格
.replace(/\=\s(.*?)/g, '=$1')
// 删除[数字]前的换行
.replace(/(\[\d+\])\r\=/g, '$1:')
// 删除[数字]前的换行
.replace(/(\[\d+\])\n\=/g, '$1:')
// 删除[数字]前的空格
.replace(/(\[\d+\])\s\=/g, '$1:')
// 删除[里面的空格换行]里面的空格换行
.replace(/[\t\r\n]/g, '')
// 删除注释行
.replace(/\s--\s\[\d+\](\n)/g, '$1') // remove comment
// 删除[里面是数字的] 视为数组需要删除
.replace(/\[(\d+)\]\=/g, '"$1":') // change equal to colon, remove brackets
// .replace(/\{(\s\[\d+\]\s\=\s)\}/g,'xxx')
// 去掉等于号前的[]括号,但是保留括号里面的字符
.replace(/\[(.*?)\]\=/g, '$1:') // change equal to colon, remove brackets
// 把等于号前面的字符加上双引号
.replace(/(\w+)\=/g, '"$1":') // change equal to colon, remove brackets
// \w+ 是英文数字下划线组成
// 替换等于号为冒号 :
.replace(/(\"[\w+]\")\=/g, '$1:') // change equal to colon, remove brackets
return str;
}
// console.log( confToJson(stringVar))
// function strcount(str,a){//计算字符串出现多少次
// var re =new RegExp(a,"gim"); // re为/^\d+bl$/gim
// let array = str.match(re);
// let count = array ? array.length: 0;
// return count;
// }
// function replacepos(text,start,stop,replacetext){
// mystr = text.substring(0,stop)+replacetext+text.substring(stop);
// return mystr;
// }
// {{}} 多个花括号转换成数组
,
toStr2(str, star) {
star = parseInt(star)
var str2 = str.slice(star)
var a = 0
var b = 0
var c = 0
var idx = 0
var isHas = false
for (let i in str2) {
i = parseInt(i)
if (str2[i] == "{") {
if (!isHas) {
idx = i
isHas = true
}
if (a > 0 && str2[i - 1] == "{") {
c++
}
a++
} else if (str2[i] == "}") {
b++
}
if (a == b) {
if (c > 0 && str2[idx + 1] == "{") {
c = 1
var res = "[" + str2.slice(idx + 1, i) + "]"
var stre = str.slice(0, star) + res + str2.slice(parseInt(i) + 1)
return stre
} else {
var stre = str
var res = str2.slice(idx + 1, i)
var ress = res.split(",");
if (ress[0].indexOf(":") == -1) {
stre = str.slice(0, star) + "[" + res + "]" + str2.slice(parseInt(i) + 1)
}
return stre
}
}
// console.log(i,str2[i],a,b,c)
}
}
//
,
toStr(str) {
var list = []
str = str.replace(/\s*/g, "")
var k1 = "{"
var k2 = "}"
var k1a = []
var k2a = []
for (let k in str) {
var v = str[k]
if (v == k1) {
str = this.toStr2(str, k)
}
}
return str
}
}
使用示例
luatable转json
fmtToStr(luatable)
content = JSON.parse(content)
var str = _luaFmt.fmtToStr(content)
var jsonstr = _luaFmt.confToJson(content)
var cjson = _luaFmt.toStr(jsonstr)
obj转luatable
listFmt(jsonObj,进度回调)