以下为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();
}
}