我正在尝试将字符串数组作为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']
我需要一种方法来强制将单个值读取为String数组。有什么可以做的吗?
编辑:
我得到查询,我需要过滤器值来过滤结果并将其发回。当filter参数中有一个值时,它将视为一个字符串并将其切碎。我需要/希望它是一个具有一个字符串值的数组。
答案 0 :(得分:1)
在评论中您说过:
问题不是我如何创建查询,而是如何从参数中获取字符串数组,即使它只是一个值。
如果您之前至少看过一次参数,则可以遍历查询字符串参数并按需构建一个数组:
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;
}