誰かのJavaScriptの宿題


友人は、私が以下の問題を解決する方法を私に尋ねました:
フォーム"(1, 2, 3), (4, 5, 6), (7, 8, 9)"に文字列を与え、フォーム[[1, 2, 3], [4, 5, 6], [7, 8, 9]]の多次元配列に変換します.
私の最初のパスのために、私はArray.prototype.reduce()とこのような2、3の正規表現で若干の楽しいShenanigansをしました.
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.
それはクールに見えるほどではありませんが、それはおそらく長期的に良いです.