Js string parsing

myEval

export const evalExp = /[!\&\|\+\-\*\%=\/<\>\^\(\)\~\:\?\;]/g;
export function myEval(originString: string, context: any) {
    if (!context) return;
    let bindKey = originString;
    bindKey = bindKey.replace(evalExp, " ");
    let bindKeys = bindKey
        .split(" ")
        .map(s => s.trim())
        .filter(e => !!e)
        .filter(e => {
            if (/^['"`]/.test(e)) {
                return false;
            }

            // 过滤布尔值
            if (e === "true" || e === "false") {
                return false;
            }

            // 过滤number
            if (!isNaN(+e)) {
                return false;
            }
            return true;
        });
    let args = bindKeys.map(s => {
        if (/\./.test(s) && /\[|\]/g.test(s)) {
            let aindex = s.indexOf(".");
            let bindex = s.indexOf("[");
            let index = Math.min(aindex, bindex);
            let obj = s.substr(0, index);
            return obj;
        } else if (/\./.test(s)) {
            let aindex = s.indexOf(".");
            let obj = s.substr(0, aindex);
            return obj;
        } else if (/\[|\]/g.test(s)) {
            let bindex = s.indexOf("[");
            let obj = s.substr(0, bindex);
            return obj;
        }
        return s;
    });
    args = toArray(new Set(args));
    const newArgs: string[] = [];
    let datas = args.map((k) => {
        if (k in context) {
            newArgs.push(k)
            return context[k]
        }
    }).filter(e => !!e);

    if (!datas.length) return;
    let funbody = `return function(${newArgs.toString()}) {
       'use strict';
       ${originString};
    }`;
    return Function(funbody)()(...datas);
}

evalFun

export function evalFun(bindKey: string, data: any) {
    if (undefinedp(data)) return;
    try {
        const r = Function(`with(this){ return ${bindKey} }`).apply(data, arguments)
        return r === '' ? undefined : r;
    } catch (error) {

    }
}

Guess you like

Origin www.cnblogs.com/ajanuw/p/12073959.html