상장 토큰, 또는 누군가의 자바스크립트 숙제

7572 단어 homeworkjavascript
친구가 다음 문제를 어떻게 해결할 수 있는지 물었습니다.
"(1, 2, 3), (4, 5, 6), (7, 8, 9)" 형식의 문자열이 주어지면 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 형식의 다차원 배열로 변환합니다.

첫 번째 패스를 위해 Array.prototype.reduce()와 다음과 같은 몇 가지 정규식을 사용하여 몇 가지 재미있는 헛소리를 했습니다...

const listified = `(1, 2, 3), (4, 5, 6), (7, 8, 9), (5, junk, 100, 2eggs)`
    .match(/\((.*?)\)/g)
  .reduce(
    (a, c) => [
      ...a,
      [
        ...c
          .match(/([0-9]+)(?=[ ,\)])/g)
          .map((el) => !isNaN(el) && parseInt(el)),
      ],
    ],
    []
  );

console.log(listified);


Demo on Replit.

멋져 보이고 멋져 보이는 것이 최신 JavaScript에서 내가 가장 좋아하는 것이지만, 이 접근 방식은 루프 내에서 루프를 호출하는 데 문제가 있으므로 문자열을 가로질러 포인터를 이동하고 찾은 숫자를 수집하는 보다 효율적인 접근 방식이 있습니다. 작업 세트로...

// Convert strings of the form `"(1, 2, 3), (4, 5, 6), (7, 8, 9)"` into
// multidimensional arrays of the form `[[1, 2, 3], [4, 5, 6], [7,8,9]]`.

const listifiedTokens = (str) => {
  let data = [];
  let ws = [];
  let x;

  for (c of str) {
    // Taking pains to prevent type-coercsion.
    if (!isNaN(c)) {
      x = x ? `${x}${c}` : c;
    }

    // Start a new work set and overwrite
    // any existing work set.
    if (c === "(") {
      ws = [];
    }

    // ')' and ',' terminate a list entry,
    // and x must be a number before we parse.
    if ([")", ","].includes(c) && !isNaN(x)) {
      ws = [...ws, parseInt(x, 10)];
    }

    // Report the work set.
    if (c === ")") {
      data = [...data, ws];
    }

    // Whenever c is NaN, we flush x
    // because this only happens at the end
    // of a valid list or when the list item
    // contains an unsupported value.
    if (isNaN(c)) {
      x = undefined;
    }
  }

  return data;
};

const str = `(1, 2, 3), (4, 5, 6), (7, 8, 8, 9), (100, 2egg, 5, bananas)`;

console.log(listifiedTokens(str));


Demo on Replit.

거의 멋지지 않지만 장기적으로는 더 나을 것입니다.

좋은 웹페이지 즐겨찾기