我有两个字符串和一个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;
}
答案 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;
}