我正在为新的js框架编写编译器,我试图直接从代码中提取对象树。我将在编译(构建)过程中执行此过程,因此每个代码都被视为纯字符串。
var a = 'Oxo('Storename',{templates:function(){},data:{},actions:
{}})'
我的主要代码使用变量a中的格式字符串。此字符串传递给函数 extraceObject(),现在 extractObject 函数将返回包含 StoreName 为0索引和索引1的我作为对象的数组:-
{
templates:function(){},
data:{},
actions:{},
}
模板,数据和操作属性包含大代码。
我已尽力而为,但由于有多个} 结算,因此我无法解决此问题。
我的代码:-
HeavyExtraction = function HeavyExtraction(x) {
var alldata = x,
mydata = x,
len = mydata.length;
var p1 ,
p2 ,
p = 0;
for(var j = p ; j < len ; j++){
if(mydata.indexOf("Oxo('") !== -1 ){
var p1 = mydata.indexOf("Oxo('");
var p2 = mydata.indexOf('})');
}
if(p1 == -1 || p2 == -1){
console.log('syntax error')
break;
}
var str = mydata.substr(p1+6,(p2 -p1)-6).replace(/\\n/g, ''),
var Data = mydata.substr(p1+6,(p2 -p1)-6);
console.log(Data)
var p = p2 + 2,
mydata = mydata.substr(p),
len = mydata.length;
}
}
我正在尝试将输出显示为:-
['Storename',{
templates:function(){},
data:{},
actions:{},
}]
我正在尝试使用node.js做到这一点 抱歉,如果我的代码最糟糕,请帮助我。
答案 0 :(得分:0)
我花了一些时间对此感到困惑,并提出了以下建议。
(templates
的值将是字符串形式的函数表达式,如果您的Storename
周围确实有引号,则需要删除引号。)
const str = 'Oxo(Storename,{templates:function(){},data:{},actions:{}})';
const storeName = str.substring(str.indexOf("(") + 1, str.indexOf(","))
const iBeginObject = str.indexOf("{"), iEndObject = str.length - str.split("").reverse().join("").indexOf("}");
const sObject = str.substring(iBeginObject, iEndObject)
.split(/templates:/).join('"templates":"')
.split(/,data:/).join('","data":')
.split(/,actions:/).join(',"actions":');
const arr = [storeName, JSON.parse(sObject)];
console.log(arr);
最大的警告是,此代码假定data
和actions
对象是JSON格式的。我没有专门的技能来编写将函数在合理的时间内将任意javascript对象转换为JSON格式的函数,但这似乎是一个不错的related resource,可能不必要。 (而且我认为必须有处理“ JSONifying”对象的库,因为这并不是一项罕见的任务,尽管我从来没有亲自使用过。)