在处理searchParams时,为空值添加的额外=会导致错误的URL。
在处理=时是否有防止不必要的searchParams的方法?
注:用RegExp()删除额外的RegExp()是可能的,但问题的目的是用searchParams__来实现它。
const u = new URL('https://example.com/?4FEE63D94&foo=1');
params = u.searchParams;
params.delete('foo'); // Delete the foo parameter
console.log(u.href); // https://example.com/?4FEE63D94=
更新
URLSearchParams方法似乎改变了URL。
URLSearchParams.entries() & URLSearchParams.forEach() & URLSearchParams.get()用空格(%20)代替+。
const u = new URL('https://example.com/?4FEE63D94&foo=1&bar=aaa+bbb+ccc');
let params = u.searchParams;
params.delete('foo'); // Delete the foo parameter
console.log(u.href); // https://example.com/?4FEE63D94=&bar=aaa+bbb+ccc
u.search = [...params.entries()].map(([key, value]) => value ? `${key}=${value}` : key).join('&');
console.log(u.href); // https://example.com/?4FEE63D94&bar=aaa%20bbb%20ccc
甚至params.delete()也会改变URL。(auth,client到auth%2Cclient)
注意:运行代码片段没有显示它
const url = 'https://example.com/?4FEE63D94&scope=auth,client&foo=1&bar=aaa+bbb+ccc';
const u = new URL(url);
let params = u.searchParams;
params.delete['foo'];
console.log(u.href); // https://example.com/?4FEE63D94=&scope=auth%2Cclient&bar=aaa+bbb+ccc
解决办法:删除不必要的=
根据@Bergi的建议
const u = new URL('https://example.com?4FEE63D94&foo=1&bar=aaa+bbb+ccc');
let params = u.searchParams;
params.delete('foo'); // Delete the foo parameter
console.log(u.href); // https://example.com/?4FEE63D94=&bar=aaa+bbb+ccc
// URL() params.delete() adds = to all params
u.search = u.search.replace(/=(?=&|$)/g, '');
console.log(u.search); // ?4FEE63D94&bar=aaa+bbb+ccc
console.log(u.href); // https://example.com/?4FEE63D94&bar=aaa+bbb+ccc
性能测试
手动处理与URLSearchParams
let t;
const n = 100000;
const url = 'https://example.com/?4FEE63D94&scope=auth,client&foo=1&bar=aaa+bbb+ccc';
const u = new URL(url);
t = performance.now();
for (let i = 0; i < n; i++) {
let params = Object.fromEntries(u.search.substring(1).split('&').map(p => p.split('=')));
delete params['foo'];
u.search = Object.entries(params).map(([key, value]) => value ? `${key}=${value}` : key).join('&');
}
console.log(`Operation took ${performance.now() - t} milliseconds`); // 731 millisecond
t = performance.now();
for (let i = 0; i < n; i++) {
let params = u.searchParams;
params.delete('foo');
}
console.log(`Operation took ${performance.now() - t} milliseconds`); // 208 millisecond
发布于 2022-04-21 09:13:50
URL类将搜索参数理解为键值对,如其中一个注释所述。您需要考虑一下FEE63D94是什么:键还是值?
如果它是一个键,那么它将有一个空值,如在FEE63D94=中
如果它是一个值,那么为它找到一个合适的键,key=FEE63D94
另一种选择是让它成为路径的一部分,https://example.com/4FEE63D94?foo=1
https://stackoverflow.com/questions/71921387
复制相似问题