typescript - 如果有一个值,则将参数作为字符串数组获取
问题描述
我正在尝试将字符串数组作为 GET 调用的参数传递:
// One value
param: filters=Something
value: filters: 'Something'
// Multiple values
param: filters=Something&filters=Something else
value: filters: [ 'Something', 'Something else' ]
问题是当我在参数中传递一个值时,代码认为它传递了一个字符串,当我传递一个以上的值时,我得到了字符串数组。
我尝试过 Array.from 等东西,但它只是从字符串创建一个数组:
['S', 'o', 'm', 'e', 't', 'h', 'i', 'n', 'g']
我需要一种方法来强制将单个值作为字符串数组读取。有什么可以做的吗?
编辑:
我得到了查询,我需要过滤器值来过滤结果并将它们发回。当 filter 参数中有一个值时,它会将其视为一个字符串并将其切碎。我需要/希望它是一个数组,具有一个字符串值。
解决方案
在评论中你说:
问题不是我如何创建查询,而是如何从参数中获取一个字符串数组,即使它只是一个值。
如果您之前已经至少看到过一次参数,您可以遍历查询字符串参数并构建一个数组:
function getParameters(query)/*: Map<String,String> */ {
const m = new Map/*<String,String>*/();
for (const part of query.split("&")) {
let [key, value] = part.split("=");
key = decodeURIComponent(key); // People commonly miss out this bit
vale = decodeURIComponent(value);
if (m.has(key)) {
let current = m.get(key);
if (Array.isArray(current)) {
current.push(value);
} else {
m.set(key, [current, value]);
}
} else {
m.set(key, value);
}
}
return m;
}
const query1 = "filters=Something&foo=bar";
const query2 = "foo=bar&filters=Something&filters=Something%20else";
console.log("query1's params:", [...getParameters(query1).entries()]);
console.log("query2's params:", [...getParameters(query2).entries()]);
.as-console-wrapper {
max-height: 100% !important;
}
或者,如果您总是想要一个特定参数的数组,则在这种情况下检查键和分支:
const arrayParams = Object.assign(Object.create(null), {
filters: true
});
function getParameters(query)/*: Map<String,String> */ {
const m = new Map/*<String,String>*/();
for (const part of query.split("&")) {
let [key, value] = part.split("=");
key = decodeURIComponent(key); // People commonly miss out this bit
vale = decodeURIComponent(value);
if (arrayParams[key]) {
// Array parameter
if (m.has(key)) {
m.get(key).push(value);
} else {
m.set(key, [value]);
}
} else {
// Non-array parameter, may or may not have multiple values (or maybe you take the last, etc.)
if (m.has(key)) {
let current = m.get(key);
if (Array.isArray(current)) {
current.push(value);
} else {
m.set(key, [current, value]);
}
} else {
m.set(key, value);
}
}
}
return m;
}
const query1 = "filters=Something&foo=bar";
const query2 = "foo=bar&filters=Something&filters=Something%20else";
console.log("query1's params:", [...getParameters(query1).entries()]);
console.log("query2's params:", [...getParameters(query2).entries()]);
.as-console-wrapper {
max-height: 100% !important;
}
推荐阅读
- python - 骑自行车者到功能列表,并结合他们的结果,直到找到匹配
- javascript - 隐藏标题后面的所有文本透明但不是图像
- python - 如何使用多个字典中的子字符串选择序列
- angular - 将 id 传入(点击)到另一个组件或路由
- javascript - 如何在不使用第三方库的情况下将 html 字符串转换为 react 元素?
- java - firebase 从数据库中获取准确的孩子
- ios - WidgetKit:根据特定时间刷新数据?
- javascript - 如何在贝宝卡支付字段中禁用填充
- reactjs - 在 popconfirm 中反应 popconfirm
- r - 是否有类似于 bedtools intersect 的 R 函数?