将字符串(Revit公式)转换为JavaScript对象

将字符串(Revit公式)转换为JavaScript对象,javascript,regex,recursion,Javascript,Regex,Recursion,我正在创建一个web应用程序,您可以在其中输入文本(Revit公式)并将其转换为JS对象,以生成一些图形树和验证 Revit formula是一个字符串,由IF和3个由逗号分隔的参数组成,如下所示: IF (<condition>, <result-if-true>, <result-if-false>) 但它不适用于嵌套 知道如何将公式转换成对象吗?我在考虑使用一些递归函数,但我不知道怎么做 function parse(str) { if(s

我正在创建一个web应用程序,您可以在其中输入文本(Revit公式)并将其转换为JS对象,以生成一些图形树和验证

Revit formula是一个字符串,由IF和3个由逗号分隔的参数组成,如下所示:

IF (<condition>, <result-if-true>, <result-if-false>)
但它不适用于嵌套

知道如何将公式转换成对象吗?我在考虑使用一些递归函数,但我不知道怎么做

  function parse(str) {
    if(str.includes("IF")) {
     const start = str.indexOf("(");
     const end = str.lastIndexOf(")");
     const [condition, value, elseValue] = str.slice(start, end).split(",");
     return {
       condition,
       value: parse(value),
       elseValue: parse(elseValue)
    };
   } else {
    return str;
   }
}
一个递归函数,只是给你一个想法


一个递归函数,只是给你一个想法。

要将
中的部分分成三组,如果(
,你可以使用此帮助程序:

const topLevelGroups=str=>{
常数gs=[];
for(设i=0,n=0;i500100200”),
TopLevelGroup(“长度>500100,如果(a、b、c)”,
TopLevelGroup(“长度>500,如果(a、b、c)、200”),
顶级组(“长度>500,如果(a、b、c)、如果(d、e、f)”,
顶级组(“长度>500,如果(a,b,c),如果(d,e,如果(f,g,h)))
//等等。。。

);
要在
之间分割零件,如果(
分为三组,可以使用此帮助程序:

const topLevelGroups=str=>{
常数gs=[];
for(设i=0,n=0;i500100200”),
TopLevelGroup(“长度>500100,如果(a、b、c)”,
TopLevelGroup(“长度>500,如果(a、b、c)、200”),
顶级组(“长度>500,如果(a、b、c)、如果(d、e、f)”,
顶级组(“长度>500,如果(a,b,c),如果(d,e,如果(f,g,h)))
//等等。。。

);正则表达式很可能是错误的工具。考虑使用适当的解析器。最有可能的正则表达式是错误的工具。请考虑使用适当的解析器。
IF ( Length < 500 , 100 , IF ( Length < 750 , 200 , IF ( Length < 1000 , 300 , 400 ) ) )
{
  condition: '<condition>',
  resultIfTrue: '<result-if-true>',
  resultIfFalse: '<result-if-false>',
}
{
  condition: '<condition>',
  resultIfTrue: {
    condition: '<condition>',
    resultIfTrue: '<result-if-true-true>',
    resultIfFalse: '<result-if-true-false>',
  },
  resultIfFalse: {
    condition: '<condition>',
    resultIfTrue: '<result-if-false-true>',
    resultIfFalse: '<result-if-false-false>',
  },
}
IF\(([^,]*),([^,]*),([^,]*)\)
  function parse(str) {
    if(str.includes("IF")) {
     const start = str.indexOf("(");
     const end = str.lastIndexOf(")");
     const [condition, value, elseValue] = str.slice(start, end).split(",");
     return {
       condition,
       value: parse(value),
       elseValue: parse(elseValue)
    };
   } else {
    return str;
   }
}