JavaScript:对数组中的整数和运算符进行排序

JavaScript:对数组中的整数和运算符进行排序,javascript,Javascript,这是我的JSFIDLE: 所以,我试图得到一个显示3个不同对象的输出: // Wanting to get // { // 0: {type: "number", value: 22}, // 1: {type: "operator", value: "+"}, // 2: {type: "number", value: 22}, // } function lexer(contents) { const tokens = []; while (contents.length) {

这是我的JSFIDLE:

所以,我试图得到一个显示3个不同对象的输出:

// Wanting to get 
// {
// 0: {type: "number", value: 22},
// 1: {type: "operator", value: "+"},
// 2: {type: "number", value: 22},
// }

function lexer(contents) {
  const tokens = [];

  while (contents.length) {
    let char     = contents[0];
    contents = contents.slice(1);

    if (/[-+*\/]/.test(char)) {
      tokens.push({ type: 'operator', value: char });
    }

    let number = '';
    while (/[1-9]/.test(char)) {
      number += char;
      char = contents[0];
      contents = contents.slice(1);
    }

    if (number !== '') {
      tokens.push({ type: 'number', value: parseInt(number, 10) });
    }
  }
  return tokens;
}

const result = lexer(["2", "2", "+", "2", "2"]);

现在我要多填些文字。我不确定这段代码到底出了什么问题,因为它似乎跳过了一个输出。我猜这与while循环有关。

您的问题是,在验证它是否是一个数字之前,您正在对
内容进行切片。因此,当它到达
+
时,它在推送令牌之前已经将其从数组中切掉,并且当带有条件
contents.length的下一个循环出现时,加号将被删除,您无法知道它在那里

我建议不要在读取字符后立即进行切片,而应该在以某种方式使用字符后进行切片,即在按下运算符标记或将字符附加到
number
之后

function lexer(contents) {
  const tokens = [];

  while (contents.length) {
    let char     = contents[0];

    if (/[-+*\/]/.test(char)) {
      tokens.push({ type: 'operator', value: char });
      contents = contents.slice(1);
    }

    let number = '';
    while (/[1-9]/.test(char)) {
      number += char;
      contents = contents.slice(1);
      char = contents[0];
    }

    if (number !== '') {
      tokens.push({ type: 'number', value: parseInt(number, 10) });
    }
  }
  return tokens;
}
这是一个细微的区别,但这样,在使用数据之前,您不会更改数组,从而确保一致性


更新的小提琴:

我搞砸了,所以+1归你:)