美文网首页
js转换luatable格式转成json支持深度转换

js转换luatable格式转成json支持深度转换

作者: yichen_china | 来源:发表于2022-12-28 14:53 被阅读0次
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,进度回调)

相关文章

网友评论

      本文标题:js转换luatable格式转成json支持深度转换

      本文链接:https://www.haomeiwen.com/subject/hbgoqdtx.html