この解答例はChatGPTによって生成されています,正しいかは自己判断で。

BFE.devでのAI解答例 - JavaScript コーディング問題
80. URLSearchParamsを実装する

class MyURLSearchParams {
  constructor(queryString) {
    this.params = {};

    if (queryString) {
      const query = queryString.startsWith("?")
        ? queryString.slice(1)
        : queryString;

      const pairs = query.split("&");

      pairs.forEach((pair) => {
        const [key, value] = pair.split("=");

        this.append(key, value);
      });
    }
  }

  append(name, value) {
    if (!this.params[name]) {
      this.params[name] = [];
    }

    this.params[name].push(value);
  }

  delete(name) {
    delete this.params[name];
  }

  entries() {
    return Object.entries(this.params);
  }

  forEach(callback) {
    this.keys().forEach((key) => {
      callback(this.get(key), key, this);
    });
  }

  get(name) {
    return this.params[name] ? this.params[name][0] : null;
  }

  getAll(name) {
    return this.params[name] || [];
  }

  has(name) {
    return this.params[name] !== undefined;
  }

  keys() {
    return Object.keys(this.params);
  }

  set(name, value) {
    this.params[name] = [value];
  }

  sort() {
    const sortedParams = {};

    Object.keys(this.params)
      .sort()
      .forEach((key) => {
        sortedParams[key] = this.params[key];
      });

    this.params = sortedParams;
  }

  toString() {
    const paramPairs = [];

    for (const [name, values] of Object.entries(this.params)) {
      for (const value of values) {
        paramPairs.push(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`)
      }
    }

    return paramPairs.join("&");
  }

  values() {
    return Object.values(this.params).reduce((acc, curr) => {
      return [...acc, ...curr];
    }, []);
  }

  [Symbol.iterator]() {
    const entries = this.entries();
    let index = 0;

    return {
      next: () => {
        if (index < entries.length) {
          const result = { value: entries[index], done: false };
          index++;
          return result;
        }

        return { value: undefined, done: true };
      },
    };
  }
}