将字符串(Revit公式)转换为JavaScript对象
我正在创建一个web应用程序,您可以在其中输入文本(Revit公式)并将其转换为JS对象,以生成一些图形树和验证 Revit formula是一个字符串,由IF和3个由逗号分隔的参数组成,如下所示:将字符串(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
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;
}
}