使用JavaScript将纯文本转换为深度json对象

u2nhd7ah  于 2023-01-22  发布在  Java
关注(0)|答案(1)|浏览(105)

我有一个普通的字符串,包含了一些类似这样的条件。
const optionString = '{2109} AND ({2370} OR {1701} OR {2702}) AND {1234} AND ({2245} OR {2339})';
我需要从上面得到一个类似下面结构的对象。

const output = {
  and: [
    2109,
    { or: [2370, 1071, 2702] },
    1234,
    { or: [2245, 2339] },
  ];

目前,我已经尝试做如下

function parseFormat(strArg) {
  var
    category,
    output = [],  // Output
    str = strArg.trim();  // Remove unwanted space before processing

  str.split('AND').forEach(function(line) {
    var removedString = line.replace(/[\])}[{(]/g, '');
    var item = removedString.split('OR');
     
    item = item.map(it => {
      return Number(it.replace(/ /g, ''))
    })
    if(item.length > 0) {
        output.push(item)
    } else {
        output.push(item[0])
    }
  
    });
  return output;
}

它的输出是这样的。

[
    [
        1069
    ],
    [
        1070,
        1071,
        1072
    ],
    [
        1244
    ],
    [
        1245,
        1339
    ]
]

我先问你一个问题

  • 如何在当前结果中添加AND和OR键?

如果您知道性能方面的好的解决方案,请及时通知我。感谢您抽出时间。

ogq8wdun

ogq8wdun1#

const optionString = '{2109} AND ({2370} OR {1701} OR {2702}) AND {1234} AND ({2245} OR {2339})';

const parseExpr = s => {
  let op, m, a = [];
  while(s?.length) {
    if(m = /^{(?<num>[0-9]+)}( (?<rest>.*))?/.exec(s)) {
      a.push(+m.groups.num);
      s = m.groups.rest;
    }
    else if(m = /^(?<op>[A-Z]+)( (?<rest>.*))?/.exec(s)) {
      let t = m.groups.op.toLowerCase();
      if(op && op!==t) throw new Error('Multiple operators cannot exist at same level in syntax tree')
      else op = t;
      s = m.groups.rest;
    }
    else if(s.startsWith('(')) {
      for(let i=0, level=0; i<s.length; i++) {
        if(s.charAt(i)==='(') level++;
        if(s.charAt(i)===')') level--;
        if(!level) {
          a.push(parseExpr(s.substring(1, i)));
          s = s.substring(i+2);
          break;
        }
        if(i===s.length-1) throw new Error('Mismatched brackets')
      }
    }
    else throw new Error(`Unparseable expression: ${s}`);
  }
  return { [op]: a };
}

const result = parseExpr(optionString)
console.log(result)

相关问题