How can I combine two URLSearchParams in Angular/TypeScript?

余生颓废 提交于 2021-02-10 15:15:30

问题


I have two URLSearchParams objects, and I want to make a third one of those two combined.

For example, I could have

let params1 = new URLSearchParams();
params1.set('page', 'one');
params1.set('size', 'hundred');

let params2 = new URLSearchParams();
params2.set('orderBy', 'size');
params2.set('order', 'asc');

let params = params1 + params2; // yes, that's illegal, but how to do that?

and I need to have all 4 parameters in the params object.

I wanted to iterate through the object key-value pairs using .entries() method, but TypeScript hides this method. Here is what I've found in lib.dom.d.ts file:

interface URLSearchParams {
    append(name: string, value: string): void;
    delete(name: string): void;
    get(name: string): string | null;
    getAll(name: string): string[];
    has(name: string): boolean;
    set(name: string, value: string): void;
}

declare var URLSearchParams: {
    prototype: URLSearchParams;
    new (init?: string | URLSearchParams): URLSearchParams;
};

So it looks like there's no possible option to iterate through URLSearchParams in TS. Any ideas?


回答1:


You can use appendAll() method see Docs as below,

let params1 = new URLSearchParams();
params1.set('page', 'one');
params1.set('size', 'hundred');

let params2 = new URLSearchParams();
params2.set('orderBy', 'size');
params2.set('order', 'asc');
let params=new URLSearchParams();
params.appendAll(params1);
params.appendAll(params2);
console.log(params)

LIVE DEMO




回答2:


Now that you've worked out it was a definition issue, here are some answers to your other dilemmas.

let params = params1 + params2; // yes, that's illegal, but how to do that?

URLSearchParams get converted into a query string via toString().

let params = params1.toString() + params2.toString();

NB: URLSearchParams create a search query where arrays are converted equivalent to array.toString() eg: q=x%2Cy%2Cz, differing from querystring.stringify() output which maps the key to each value in an array, eg q=x&q=y&q=z. This is something to be aware of if you're merging URLSearchParams via append/appendAll, and have duplicate keys.

To have duplicate keys, behaving more like querystring, create using iterators.

let params = new URLSearchParams([
    ['page', 'one'],
    ['size', 'hundred'],
    ['orderBy', 'size'],
    ['order', 'asc']
]);

Alternatively, params.forEach((value, name[, searchParams]) => {}) is also available to iterate.

Manually setting each key-value misses one of the best features of this constructor - it's parsing capabilities! Any leading ? is ignored from strings great for appending params to a url query string.

let params1 = new URLSearchParams(('?page=one&size=hundred');
let params2 = new URLSearchParams({
    orderBy: 'size',
    order: 'asc'
});


来源:https://stackoverflow.com/questions/45126076/how-can-i-combine-two-urlsearchparams-in-angular-typescript

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!