如何将三元表达式解析成数组?

件数>30?200:件数>25?100:75
期望结果: ['件数','>','30','?','200',':','件数','>','25','?','100',':','75']

阅读 1.5k
2 个回答

你可以通过正则表达式将这个三元表达式解析成数组:

function parseTernaryExpression(expression) {
    const regex = /([a-zA-Z]+|\d+|[<>?=]+)/g;
    return expression.match(regex);
}

const expression = "件数>30?200:件数>25?100:75";
const parsedArray = parseTernaryExpression(expression);
console.log(parsedArray);

除了使用正则表达式之外,还有其他方法可以将三元表达式解析成数组。以下是两种替代方法:
字符遍历法

function parseTernaryExpression(expression) {
    let result = [];
    let current = '';

    for (let i = 0; i < expression.length; i++) {
        const char = expression[i];
        if (/[a-zA-Z0-9]/.test(char)) {
            current += char;
        } else {
            if (current !== '') {
                result.push(current);
                current = '';
            }
            result.push(char);
        }
    }

    if (current !== '') {
        result.push(current);
    }

    return result;
}

const expression = "件数>30?200:件数>25?100:75";
const parsedArray = parseTernaryExpression(expression);
console.log(parsedArray);

split() 和 reduce() 组合法

function parseTernaryExpression(expression) {
    const delimiters = ['>', '<', '?', ':'];
    const regex = new RegExp(`[${delimiters.join('\\')}]+`);

    return expression.split(regex).reduce((result, part, index) => {
        const delimiter = expression[part.length + index * (part.length + 1)];
        result.push(part, delimiter);
        return result;
    }, []).slice(0, -1);
}

const expression = "件数>30?200:件数>25?100:75";
const parsedArray = parseTernaryExpression(expression);
console.log(parsedArray);
  const expression = "件数>30?200:件数>25?100:75";

  const array = [];
  let buffer = '';
  // 遍历条件表达式中的每个字符,如果当前字符是 ? 或 :,
  // 则将 buffer 中的内容去除首尾空格后,加入到 array 中,
  // 并将当前字符也加入到 array 中;否则,将当前字符加入到 buffer 中。
  // 循环结束后将 buffer 中的内容去除首尾空格后,加入到 array 中
  for (let i = 0; i < expression.length; i++) {
    const char = expression[i];
    switch (char) {
      case '?':
      case ':':
        array.push(buffer.trim());
        array.push(char);
        buffer = '';
        break;
      default:
        buffer += char;
        break;
    }
  }

  array.push(buffer.trim());

  console.log(array); // ['件数','>','30','?','200',':','件数','>','25','?','100',':','75']
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题