使用 JavaScript 中的递归逻辑有效获取 URL 参数
设想
使用给定的搜索参数键(例如“from”)从 URL 部分中的嵌套 URL 中提取目标搜索参数的值(例如“id”)。
例如,对于 URL“/main?from=/details?from=/more?id=456”,函数“getNestedSearchParamValue”通过查找搜索参数“from”来提取嵌套 URL。
... const nestedUrl = new URL(urlPart, dummyUrl); const nestedUrlPart = nestedUrl.searchParams.get(nestedParamKey) ?? ""; ...
首先,提取嵌套 URL `/details?from=/more?id=456`。由于 URL 包含另一个 `from` 搜索参数,`getNestedSearchParamValue` 函数会调用自身,将提取的 URL `/details?from=/more?id=456` 作为 `urlPart` 传递,同时传递相同的 `nestedParamKey` (`from`) 和 `targetParamKey` (`id`)。
...
if(nestedUrlPart.includes(nestedParamKey)){
return getNestedSearchParamValue(nestedUrlPart, nestedParamKey, targetParamKey);
}
...在第一次递归调用中,`nestedUrlPart` 变成了 `/more?id=456`,由于这个 URL 不包含搜索参数 `from`(`nestedParamKey`),所以表示这是要搜索 `id` 参数的目标 URL(`targetParamKey`),因此从这个 URL 部分中提取搜索参数 `id` 的值。
...
else {
const targetUrl = new URL(nestedUrlPart, dummyUrl);
return targetUrl.searchParams.get(targetParamKey);
}
...功能
const dummyUrl = "http://localhost";
function getNestedSearchParamValue(urlPart: string, nestedParamKey: string, targetParamKey: string): string | null {
const nestedUrl = new URL(urlPart, dummyUrl);
const nestedUrlPart = nestedUrl.searchParams.get(nestedParamKey) ?? "";
if(!nestedUrlPart){
return null;
}
if(nestedUrlPart.includes(nestedParamKey)){
return getNestedSearchParamValue(nestedUrlPart, nestedParamKey, targetParamKey);
}
else {
const targetUrl = new URL(nestedUrlPart, dummyUrl);
return targetUrl.searchParams.get(targetParamKey);
}
}用法
const url = "/main?from=/details?from=/more?id=456"; const value = getNestedSearchParamValue(url, "from", "id"); console.log(value);
输出
[LOG]: "456"
替代方案:使用 URLSearchParams
使用辅助函数“getUrlPartSearchParams”
const queryDelimiter = "?";
function getUrlPartSearchParams(urlPart: string):URLSearchParams | null {
const [_, ...query] = urlPart.split(queryDelimiter);
const queryStr = query.join(queryDelimiter);
return new URLSearchParams(queryStr);
}函数 getNestedSearchParamValue 变为
function getNestedSearchParamValue(urlPart: string, nestedParamKey: string, targetParamKey: string): string | null {
let searchParams = getUrlPartSearchParams(urlPart);
const nestedUrlPart = searchParams?.get(nestedParamKey);
// console.log(nestedUrlPart)
if(!nestedUrlPart) {
return null;
}
if (nestedUrlPart.includes(nestedParamKey)) {
return getNestedSearchParamValue(nestedUrlPart, nestedParamKey, targetParamKey);
} else {
searchParams = getUrlPartSearchParams(nestedUrlPart);
return searchParams?.get(targetParamKey) ?? null;
}
}