将数组传递到 URLSearchParams,同时使用 get 请求的 http 调用
Passing array into URLSearchParams while consuming http call for get request
查看 URLSearchParams 的 Angular 文档,我没有找到任何关于将数组作为参数传递的文档。
有人可以帮忙吗?
事实上,你不能直接传递一个数组,但你可以多次使用append
方法:
let params = new URLSearchParams();
params.append('arrayparams', 'val1');
params.append('arrayparams', 'val2');
params.append('arrayparams', 'val3');
console.log(params.toString());
我已经使用 Lodash map
迭代 objects/arrays 并动态附加参数。
const buildParams = (data) => {
const params = new URLSearchParams();
map(data, (value, key) => {
if (Array.isArray(data[key])) {
map(value, item => params.append(key, item));
} else {
params.append(key, value);
}
});
return params;
};
const params = {
foo: ['a', 'b', 'c'],
bar: 'xyz'
}
const doFetch = fetch(`http://api.com/search?${buildParams(params)}`)
所以最后的 URL 看起来像:http://api.com/search?foo=a&foo=b&foo=c&bar=xyz
URLSearchParams 可以传递一对序列,因此要有一个值数组:
var ids = [1,2,3,4]
var search = new URLSearchParams(ids.map(s=>['id',s]))
var searchString = search.toString()
// "id=1&id=2&id=3&id=4"
// To get the ids from the URL search string
var search_ids = [...search.getAll('id')]
makeSearchParams(link){
var url = new URL(window.location.protocol + '//' + window.location.host + link);
const params = this.getSearchParams();
for(let key in params){
if(Array.isArray(params[key])){
for(let key1 in params[key]){
url.searchParams.append(key +'[]', params[key][key1]);
}
}
else
url.searchParams.append(key, params[key]);
}
return url;
}
const buildParams = (search) => {
if (!search) return "";
const params = new URLSearchParams();
Object.entries(search).forEach(([key, value]) => {
if (Array.isArray(value)) params.append(key, value.join(","));
else params.append(key, value.toString());
});
return `?${params}`;
};
const search = {
types: ['good', 'bad', 'normal'],
id: 777
}
const url = `http://good.com/${buildParams(search)}`;
因此,您将获得http://good.com/?types=good,bad,normal&id=777
实际上这是最简单的功能方式:
const url = new URL('http://localhost/')
url.searchParams.append('date[0]', date1)
url.searchParams.append('date[1]', date2)
console.log(url.toString())
当然可以遍历数组。
如果您想使用@washington-braga 的方法但又不想安装 lodash:
function buildParams(data) {
const params = new URLSearchParams()
Object.entries(data).forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach(value => params.append(key, value.toString())
} else {
params.append(key, value.toString())
}
});
return params.toString()
}
这是一个自动将数组值作为多个 entries/keys 添加到查询字符串中的函数。
与已发布的其他解决方案的不同之处在于,它更易于阅读并且只考虑数组 - 无需再次附加所有其他对象键。
function convertToQueryUrl(obj: never): string {
const params = new URLSearchParams(obj);
for (const [key, value] of Object.entries(obj)) {
if (Array.isArray(value)) {
params.delete(key);
value.forEach((v) => params.append(key, v));
}
}
return params.toString();
}
查看 URLSearchParams 的 Angular 文档,我没有找到任何关于将数组作为参数传递的文档。
有人可以帮忙吗?
事实上,你不能直接传递一个数组,但你可以多次使用append
方法:
let params = new URLSearchParams();
params.append('arrayparams', 'val1');
params.append('arrayparams', 'val2');
params.append('arrayparams', 'val3');
console.log(params.toString());
我已经使用 Lodash map
迭代 objects/arrays 并动态附加参数。
const buildParams = (data) => {
const params = new URLSearchParams();
map(data, (value, key) => {
if (Array.isArray(data[key])) {
map(value, item => params.append(key, item));
} else {
params.append(key, value);
}
});
return params;
};
const params = {
foo: ['a', 'b', 'c'],
bar: 'xyz'
}
const doFetch = fetch(`http://api.com/search?${buildParams(params)}`)
所以最后的 URL 看起来像:http://api.com/search?foo=a&foo=b&foo=c&bar=xyz
URLSearchParams 可以传递一对序列,因此要有一个值数组:
var ids = [1,2,3,4]
var search = new URLSearchParams(ids.map(s=>['id',s]))
var searchString = search.toString()
// "id=1&id=2&id=3&id=4"
// To get the ids from the URL search string
var search_ids = [...search.getAll('id')]
makeSearchParams(link){
var url = new URL(window.location.protocol + '//' + window.location.host + link);
const params = this.getSearchParams();
for(let key in params){
if(Array.isArray(params[key])){
for(let key1 in params[key]){
url.searchParams.append(key +'[]', params[key][key1]);
}
}
else
url.searchParams.append(key, params[key]);
}
return url;
}
const buildParams = (search) => {
if (!search) return "";
const params = new URLSearchParams();
Object.entries(search).forEach(([key, value]) => {
if (Array.isArray(value)) params.append(key, value.join(","));
else params.append(key, value.toString());
});
return `?${params}`;
};
const search = {
types: ['good', 'bad', 'normal'],
id: 777
}
const url = `http://good.com/${buildParams(search)}`;
因此,您将获得http://good.com/?types=good,bad,normal&id=777
实际上这是最简单的功能方式:
const url = new URL('http://localhost/')
url.searchParams.append('date[0]', date1)
url.searchParams.append('date[1]', date2)
console.log(url.toString())
当然可以遍历数组。
如果您想使用@washington-braga 的方法但又不想安装 lodash:
function buildParams(data) {
const params = new URLSearchParams()
Object.entries(data).forEach(([key, value]) => {
if (Array.isArray(value)) {
value.forEach(value => params.append(key, value.toString())
} else {
params.append(key, value.toString())
}
});
return params.toString()
}
这是一个自动将数组值作为多个 entries/keys 添加到查询字符串中的函数。
与已发布的其他解决方案的不同之处在于,它更易于阅读并且只考虑数组 - 无需再次附加所有其他对象键。
function convertToQueryUrl(obj: never): string {
const params = new URLSearchParams(obj);
for (const [key, value] of Object.entries(obj)) {
if (Array.isArray(value)) {
params.delete(key);
value.forEach((v) => params.append(key, v));
}
}
return params.toString();
}