正则表达式从字符串获取对象参数,并从JSON / Js Object获取那些参数的值

时间:2019-01-02 18:37:20

标签: javascript regex string

我有两个字符串和一个Js对象

var strArr = '$PARAMS["version"]["config"]$';
var strObj = "$PARAMS.version.config$;

和JS对象

var obj = {
    "version": {
        "config": {
            "prod": "stackoverflow"
        }
    }
}

字符串可以以strArr或strObj的形式出现,我正在尝试获取一个正则表达式来从两个字符串中提取版本和配置(以此类推),并从Js obj获取相同的值

例如:obj["version"]["config]

我能够为strArr解决此问题,即'$ PARAMS [“ version”] [“ config”] $',需要修改下面的getVal函数中的regex才能为strObj工作。

也可以在下面的函数中使用strArr或strObj

function getVal(obj, path) => {
    let regex = /\["(.*?)"\]/mg;
    let m;

    while ((m = regex.exec(path)) !== null) {
        // This is necessary to avoid infinite loops with zero-width matches
        if (m.index === regex.lastIndex) {
            regex.lastIndex++;
        }

        if(typeof obj[m[1]] !== 'undefined') obj = obj[m[1]];
        else return obj[m[1]];
    }
    return obj;
}

1 个答案:

答案 0 :(得分:0)

将正则表达式更改为 /。([[w] )| [“(。?)”] / mg 并在功能中添加以下线可解决问题 否则if(typeof obj [m [2]]!=='undefined')obj = obj [m [2]];

最终功能如下

function getVal(obj, path) {
                    let regex = /\.([\w]*)|\["(.*?)"\]/mg;
                    // let regex = /\["(.*?)"\]/mg;
                    let m;
                    while ((m = regex.exec(path)) !== null) {
                        // This is necessary to avoid infinite loops with zero-width matches
                        if (m.index === regex.lastIndex) {
                            regex.lastIndex++;
                        }
                        if(typeof obj[m[1]] !== 'undefined') obj = obj[m[1]];
                        else if(typeof obj[m[2]] !== 'undefined') obj = obj[m[2]];
                        //TODO: Add logic to through error if the parameter is not found
                    }
                    return obj;
                }