LearningRecord icon indicating copy to clipboard operation
LearningRecord copied to clipboard

URLSearchParams() 接口是用来解析和处理 URL 参数的 API,目前最新的浏览器和 Node 都支持它。请用 class URLSearchParams {} 语法实现一个该接口的 polyfill,考虑到时间因素,答题者只需实现下面列举的要求即可

Open Rashomon511 opened this issue 5 years ago • 0 comments

// 构造函数支持传入 URL 参数串
searchParams = new URLSearchParams("foo=1&bar=2") 

// 构造函数也支持传入一个包含参数键值对的对象
searchParams = new URLSearchParams({foo: "1", bar: "2"})

// 实例支持 get()、set()、has()、append() 四个方法
console.log(searchParams.get("foo")) // "1"
searchParams.set("foo", "10") 
console.log(searchParams.has("bar")) // true
searchParams.append("foo", "100") 

// 实例支持 toString() 方法
console.log(searchParams.toString()) // "foo=10&bar=2&foo=100"

// 实例支持 for-of 迭代
for(const [key, value] of searchParams) {
  console.log([key, value])
  // ["foo", "10"]
  // ["bar", "2"]
  // ["foo", "100"]
}
class URLSearchParams {
  #searchParams = []

  constructor(init) {
    if (typeof init === "string") {
      this.#searchParams = init.split("&").map(kv => kv.split("="))
    } else {
      this.#searchParams = Object.entries(init)
    }
  }

  get(key) {
    const param = this.#searchParams.find(param => param[0] === key)
    return param && param[1]
  }

  set(key, value) {
    const param = this.#searchParams.find(param => param[0] === key)

    if (param) {
      param[1] = value
    } else {
      this.#searchParams.push([key, value])
    }
  }

  has(key) {
    return this.#searchParams.some(param => param[0] === key)
  }

  append(key, value) {
    this.#searchParams.push([key, value])
  }

  toString() {
    return this.#searchParams.map(param => param.join("=")).join("&")
  }

  *[Symbol.iterator]() {
    yield* this.#searchParams
  }
} 

Rashomon511 avatar Aug 30 '19 02:08 Rashomon511