Извлечь объект из середины большого текста - PullRequest
0 голосов
/ 01 февраля 2019

Я пишу компилятор для моей новой JS Framework, я пытаюсь извлечь дерево объектов из моего кода напрямую.Это процесс, который я буду выполнять в процессе компиляции (сборки), поэтому каждый код рассматривается как чистая строка.

     var a = 'Oxo('Storename',{templates:function(){},data:{},actions: 
      {}})'

У меня есть основной код в строке формата в переменной a.Эта строка передается функции extraceObject () сейчас extractObject Функция вернет мне массив, который содержит StoreName в качестве 0 индекса, а индекс 1 возвращает мне объект в виде: -

        {
          templates:function(){},
          data:{},
          actions:{},
        }

Шаблон, данные и свойство action содержат большой код.

Я старался изо всех сил, но мне не удалось решить эту проблему, потому что есть несколько номеров закрытия } .

Мой код: -

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 голосов
/ 01 февраля 2019

Я потратил немного времени на то, чтобы подумать над этим, и придумал следующее:
(Значение 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, но это похоже на хороший связанный ресурс , который может сделать это ненужным.(И я думаю, что должны быть библиотеки, которые обрабатывают объекты JSONifying, поскольку это не редкая задача, хотя я никогда не использовал ее сам).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...