从大文本中间提取对象

时间:2019-02-01 09:14:41

标签: javascript compiler-construction

我正在为新的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做到这一点 抱歉,如果我的代码最糟糕,请帮助我。

1 个答案:

答案 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);

最大的警告是,此代码假定dataactions对象是JSON格式的。我没有专门的技能来编写将函数在合理的时间内将任意javascript对象转换为JSON格式的函数,但这似乎是一个不错的related resource,可能不必要。 (而且我认为必须有处理“ JSONifying”对象的库,因为这并不是一项罕见的任务,尽管我从来没有亲自使用过。)