以下为ChatGPT自动生成的解答,正确与否请自行判断。

BFE.devAI解答 - JavaScript 代码题
80. 实现URLSearchParams

实现一个类MyURLSearchParams,维护一个内部的params对象,完成以下方法:

  • constructor(input: string = ''): 构造函数,接收一个查询字符串,将其解析为params对象
  • append(name: string, value: string): void: 将指定键值对添加到params对象中,如果已存在该键,则添加到值数组中
  • delete(name: string): void: 从params对象中删除指定键
  • entries(): Iterator<[string, string]>: 返回一个迭代器,迭代器中的每个元素是[name, value]的形式
  • forEach(callback: (value: string, name: string, searchParams: MyURLSearchParams) => void): void: 对params对象中的每个键值对调用指定的回调函数
  • getAll(name: string): string[]: 返回指定键的所有值的数组
  • get(name: string): string | null: 返回指定键的第一个值,如果键不存在则返回null
  • has(name: string): boolean: 判断指定键是否存在于params对象中
  • keys(): Iterator<string>: 返回一个迭代器,迭代器中的每个元素是参数名称
  • set(name: string, value: string): void: 设置指定键的值,如果已存在该键,则替换第一个值
  • sort(): void: 根据键名对params对象中的所有键值对进行排序
  • toString(): string: 将params对象转换为查询字符串的形式
  • values(): Iterator<string>: 返回一个迭代器,迭代器中的每个元素是参数值

实现如下:

class MyURLSearchParams {
  constructor(input = '') {
    this.params = new Map();
    if (input.startsWith('?')) {
      input = input.slice(1);
    }
    if (input) {
      const pairs = input.split('&');
      for (const pair of pairs) {
        const [name, value] = pair.split('=');
        this.append(decodeURIComponent(name), decodeURIComponent(value));
      }
    }
  }

  append(name, value) {
    if (!this.params.has(name)) {
      this.params.set(name, []);
    }
    this.params.get(name).push(String(value));
  }

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

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

  forEach(callback) {
    for (const [name, values] of this.params) {
      for (const value of values) {
        callback.call(this, value, name, this);
      }
    }
  }

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

  get(name) {
    const values = this.getAll(name);
    return values.length > 0 ? values[0] : null;
  }

  has(name) {
    return this.params.has(name);
  }

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

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

  sort() {
    const keys = [...this.params.keys()];
    keys.sort();
    const newParams = new Map();
    for (const key of keys) {
      newParams.set(key, this.params.get(key));
    }
    this.params = newParams;
  }

  toString() {
    const pairs = [];
    for (const [name, values] of this.params) {
      for (const value of values) {
        pairs.push(`${encodeURIComponent(name)}=${encodeURIComponent(value)}`);
      }
    }
    return pairs.join('&');
  }

  values() {
    const values = [];
    for (const [, val] of this.params) {
      values.push(...val);
    }
    return values.values();
  }
}