query-string, uri-js, uri-template, url-parse, and whatwg-url are JavaScript libraries designed to handle various aspects of URI (Uniform Resource Identifier) manipulation, parsing, and construction. query-string specializes in encoding and decoding URL query parameters with support for arrays and objects. uri-js provides comprehensive URI parsing, validation, and resolution according to RFC 3986 and related standards. uri-template implements RFC 6570 for expanding URI templates with dynamic values. url-parse offers a lightweight, cross-environment URL parser that works consistently in both browsers and Node.js. whatwg-url is a spec-compliant implementation of the WHATWG URL Standard, providing URL and URLSearchParams APIs that match modern browser behavior, even in older JavaScript environments.
When building modern web applications — especially those that interact with APIs, handle routing, or manage client-side state via the URL — you’ll inevitably need to parse, construct, or manipulate URIs. While browsers provide native APIs like URL and URLSearchParams, they don’t cover every use case, particularly around templating, full RFC compliance, or lightweight parsing without side effects. That’s where specialized npm packages come in.
Let’s compare five widely used libraries: query-string, uri-js, uri-template, url-parse, and whatwg-url. Each serves a distinct purpose, and choosing the right one depends on your specific needs around standards compliance, feature scope, and browser compatibility.
query-stringFocused exclusively on parsing and stringifying query strings (the part after ? in a URL). It supports array/object serialization, custom delimiters, and decoding strategies. It does not parse full URLs — just the search component.
import queryString from 'query-string';
const parsed = queryString.parse('foo=bar&baz=qux');
// { foo: 'bar', baz: 'qux' }
const str = queryString.stringify({ x: [1, 2], y: 'hello' });
// 'x=1&x=2&y=hello'
uri-jsA full-featured URI parser and validator based strictly on RFC 3986. It can parse, resolve, normalize, and validate any URI component (scheme, authority, path, query, fragment). It also supports IRI (Internationalized Resource Identifiers) and URNs.
import * as URI from 'uri-js';
const parts = URI.parse('https://example.com/path?foo=bar#section');
// { scheme: 'https', host: 'example.com', path: '/path', query: 'foo=bar', fragment: 'section' }
URI.resolve('https://a.com/base/', '../other');
// 'https://a.com/other'
uri-templateSpecializes in expanding URI templates as defined by RFC 6570. You define a template like /users/{id}/posts{?page,size} and inject values to produce a concrete URL.
import UriTemplate from 'uri-template';
const template = UriTemplate.parse('/api/users/{userId}{?active,role}');
const url = template.expand({ userId: 123, active: true, role: 'admin' });
// '/api/users/123?active=true&role=admin'
url-parseA lightweight, cross-environment URL parser that works consistently in both Node.js and browsers. It parses full URLs into components and offers utilities for relative URL resolution and origin comparison.
import Url from 'url-parse';
const url = new Url('https://user:pass@sub.example.com:8080/path?query=1#frag');
console.log(url.hostname); // 'sub.example.com'
console.log(url.port); // '8080'
// Resolve relative URL
const base = new Url('https://example.com/base/');
const resolved = base.resolve('../other');
// 'https://example.com/other'
whatwg-urlA spec-compliant implementation of the WHATWG URL Standard, which is the same standard used by modern browsers. It provides URL and URLSearchParams classes that behave identically to their browser counterparts, even in older Node.js versions.
import { URL, URLSearchParams } from 'whatwg-url';
const url = new URL('https://example.com/path?foo=bar');
url.searchParams.append('baz', 'qux');
console.log(url.toString());
// 'https://example.com/path?foo=bar&baz=qux'
// Works exactly like browser's URL
This is a critical differentiator:
whatwg-url implements the WHATWG URL Standard — the living standard used by all modern browsers. If you want behavior that matches new URL() in Chrome or Firefox, this is your choice.uri-js follows RFC 3986 (and related RFCs like 6570 for templating via an add-on). This is more academic and strict, supporting edge cases like IPv6 literals, percent-encoding rules, and URN schemes.url-parse aims for practical compatibility, not strict RFC adherence. It handles real-world URLs well but may diverge from formal specs in ambiguous cases.query-string and uri-template each implement specific sub-standards: query-string uses common web conventions (similar to application/x-www-form-urlencoded), while uri-template strictly follows RFC 6570.⚠️ Note: The WHATWG standard and RFC 3986 are not identical. For example, WHATWG normalizes hosts to lowercase and enforces stricter port parsing. In most web apps, WHATWG behavior is preferred because it matches the browser.
| Package | Parses full URL? | Returns structured object? | Resolves relative URLs? |
|---|---|---|---|
query-string | ❌ No | ❌ Only query string | ❌ |
uri-js | ✅ Yes | ✅ Detailed parts | ✅ (resolve) |
uri-template | ❌ No | ❌ Template only | ❌ |
url-parse | ✅ Yes | ✅ Simple object | ✅ (resolve method) |
whatwg-url | ✅ Yes | ✅ URL instance | ❌ (use .href with base) |
Example: resolving a relative path
// uri-js
URI.resolve('https://a.com/base/', '../other'); // 'https://a.com/other'
// url-parse
new Url('https://a.com/base/').resolve('../other'); // 'https://a.com/other'
// whatwg-url (requires base URL as second arg)
new URL('../other', 'https://a.com/base/').href; // 'https://a.com/other'
Only query-string and whatwg-url (via URLSearchParams) offer rich query manipulation:
// query-string
queryString.parseUrl('https://x.com/?a=1&a=2').query;
// { a: ['1', '2'] } — arrays supported by default
// whatwg-url
const params = new URLSearchParams('a=1&a=2');
params.getAll('a'); // ['1', '2']
However, query-string supports nested objects and custom array formats out of the box:
queryString.stringify({ filter: { type: 'user', active: true } }, { arrayFormat: 'bracket' });
// 'filter[type]=user&filter[active]=true'
URLSearchParams does not support nested structures — it only handles flat key-value pairs.
Only uri-template handles RFC 6570 templates:
// uri-template
UriTemplate.parse('/search{?q,lang}').expand({ q: 'js', lang: 'en' });
// '/search?q=js&lang=en'
// Other packages cannot do this natively
If you’re consuming hypermedia APIs (like those using HAL or OpenAPI with templated links), this is essential.
whatwg-url is ideal when you need consistent URL behavior across Node.js versions, especially pre-v10 where native URL was incomplete. In modern environments (Node 14+, evergreen browsers), you might not need it — but it’s safe to use as a polyfill.url-parse shines in isomorphic apps where you can’t rely on the global URL (e.g., old browsers or strict CSP environments). It’s dependency-free and tiny.uri-js works everywhere but is heavier due to its comprehensive RFC support. Avoid if you only need basic parsing.query-string is pure utility — no environment assumptions. Perfect for query manipulation regardless of platform.uri-template is environment-agnostic and focused solely on templating.Don’t use query-string to parse full URLs. It will treat the entire string as a query, leading to bugs:
queryString.parse('https://example.com?foo=bar');
// { 'https://example.com?foo': 'bar' } ← wrong!
Don’t expect whatwg-url to handle URI templates. It’s strictly for concrete URLs.
Avoid mixing uri-js and whatwg-url in the same codebase unless you understand their spec differences. They may produce different results for edge-case URLs.
url-parse does not auto-decode percent-encoded components like whatwg-url does. You may need to call decodeURIComponent manually on parts like pathname.
| Use Case | Recommended Package(s) |
|---|---|
| Parse or build query strings with arrays/objects | query-string |
| Need exact browser-like URL behavior | whatwg-url (or native URL) |
| Work with RFC 6570 URI templates | uri-template |
| Lightweight, consistent parsing in all JS envs | url-parse |
| Full RFC 3986 compliance (e.g., for tooling) | uri-js |
| Validate or normalize complex URIs (IPv6, etc) | uri-js |
URL and URLSearchParams. Only reach for whatwg-url if you need to support older runtimes.query-string is unmatched.uri-template is the only correct choice.url-parse when you can’t trust the environment’s URL implementation but don’t need full RFC rigor.uri-js for tooling, validators, or systems requiring strict URI conformance — it’s overkill for typical app logic.These libraries aren’t competitors — they solve different layers of the URI problem. The key is matching the tool to the task.
Choose query-string when your primary need is robust parsing and stringification of URL query strings, especially if you require support for nested objects, array formats (like bracket notation), or custom encoding/decoding strategies. It’s ideal for client-side state management via query parameters or API clients that serialize complex filters into URLs. Avoid it if you need to parse full URLs or handle URI templates.
Choose uri-js when you need strict compliance with RFC 3986 for URI parsing, validation, normalization, or resolution — such as in tooling, linters, or systems that must handle edge cases like IPv6 literals, internationalized domain names, or non-http schemes. It’s overkill for typical web app routing but invaluable when correctness per formal standards is non-negotiable.
Choose uri-template exclusively when working with RFC 6570 URI templates, commonly found in hypermedia-driven APIs (e.g., HAL, OpenAPI). It allows you to safely expand templates like /users/{id}{?active,role} into concrete URLs. Don’t use it for general URL parsing or query string manipulation — it serves one narrow but critical purpose.
Choose url-parse when you need a lightweight, dependency-free URL parser that behaves consistently across all JavaScript environments (including older browsers and Node.js) without relying on global URL. It’s well-suited for isomorphic apps or libraries that must avoid native API inconsistencies, though it lacks advanced query handling or strict RFC compliance.
Choose whatwg-url when you require exact parity with the browser’s native URL and URLSearchParams APIs in environments where they’re missing or incomplete (e.g., legacy Node.js). It’s the safest way to ensure your URL logic behaves identically across client and server. In modern runtimes, prefer the native APIs unless you need guaranteed consistency.
Parse and stringify URL query strings
npm install query-string
[!WARNING] Remember the hyphen! Do not install the deprecated
querystringpackage!
For browser usage, this package targets the latest version of Chrome, Firefox, and Safari.
import queryString from 'query-string';
console.log(location.search);
//=> '?foo=bar'
const parsed = queryString.parse(location.search);
console.log(parsed);
//=> {foo: 'bar'}
console.log(location.hash);
//=> '#token=bada55cafe'
const parsedHash = queryString.parse(location.hash);
console.log(parsedHash);
//=> {token: 'bada55cafe'}
parsed.foo = 'unicorn';
parsed.ilike = 'pizza';
const stringified = queryString.stringify(parsed);
//=> 'foo=unicorn&ilike=pizza'
location.search = stringified;
// note that `location.search` automatically prepends a question mark
console.log(location.search);
//=> '?foo=unicorn&ilike=pizza'
Parse a query string into an object. Leading ? or # are ignored, so you can pass location.search or location.hash directly.
The returned object is created with Object.create(null) and thus does not have a prototype.
queryString.parse('?foo=bar');
//=> {foo: 'bar'}
queryString.parse('#token=secret&name=jhon');
//=> {token: 'secret', name: 'jhon'}
Type: object
Type: boolean
Default: true
Decode the keys and values. URL components are decoded with decode-uri-component.
Type: string
Default: 'none'
'bracket': Parse arrays with bracket representation:import queryString from 'query-string';
queryString.parse('foo[]=1&foo[]=2&foo[]=3', {arrayFormat: 'bracket'});
//=> {foo: ['1', '2', '3']}
'index': Parse arrays with index representation:import queryString from 'query-string';
queryString.parse('foo[0]=1&foo[1]=2&foo[3]=3', {arrayFormat: 'index'});
//=> {foo: ['1', '2', '3']}
'comma': Parse arrays with elements separated by comma:import queryString from 'query-string';
queryString.parse('foo=1,2,3', {arrayFormat: 'comma'});
//=> {foo: ['1', '2', '3']}
'separator': Parse arrays with elements separated by a custom character:import queryString from 'query-string';
queryString.parse('foo=1|2|3', {arrayFormat: 'separator', arrayFormatSeparator: '|'});
//=> {foo: ['1', '2', '3']}
'bracket-separator': Parse arrays (that are explicitly marked with brackets) with elements separated by a custom character:import queryString from 'query-string';
queryString.parse('foo[]', {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> {foo: []}
queryString.parse('foo[]=', {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> {foo: ['']}
queryString.parse('foo[]=1', {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> {foo: ['1']}
queryString.parse('foo[]=1|2|3', {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> {foo: ['1', '2', '3']}
queryString.parse('foo[]=1||3|||6', {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> {foo: ['1', '', 3, '', '', '6']}
queryString.parse('foo[]=1|2|3&bar=fluffy&baz[]=4', {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> {foo: ['1', '2', '3'], bar: 'fluffy', baz:['4']}
'colon-list-separator': Parse arrays with parameter names that are explicitly marked with :list:import queryString from 'query-string';
queryString.parse('foo:list=one&foo:list=two', {arrayFormat: 'colon-list-separator'});
//=> {foo: ['one', 'two']}
'none': Parse arrays with elements using duplicate keys:import queryString from 'query-string';
queryString.parse('foo=1&foo=2&foo=3');
//=> {foo: ['1', '2', '3']}
Type: string
Default: ','
The character used to separate array elements when using {arrayFormat: 'separator'}.
Type: Function | boolean
Default: true
Supports both Function as a custom sorting function or false to disable sorting.
Type: boolean
Default: false
import queryString from 'query-string';
queryString.parse('foo=1', {parseNumbers: true});
//=> {foo: 1}
Parse the value as a number type instead of string type if it's a number.
Type: boolean
Default: false
import queryString from 'query-string';
queryString.parse('foo=true', {parseBooleans: true});
//=> {foo: true}
Parse the value as a boolean type instead of string type if it's a boolean.
Type: object
Default: {}
Specifies a schema for parsing query values with explicit type declarations. When defined, the types provided here take precedence over general parsing options such as parseNumbers, parseBooleans, and arrayFormat.
Use this option to explicitly define the type of a specific parameter—particularly useful in cases where the type might otherwise be ambiguous (e.g., phone numbers or IDs).
You can also provide a custom function to transform the value. The function will receive the raw string and should return the desired parsed result. When used with array formats (like comma, separator, bracket, etc.), the function is applied to each array element individually.
Supported Types:
'boolean': Parse flagged as a boolean (overriding the parseBooleans option):queryString.parse('?isAdmin=true&flagged=true&isOkay=0', {
parseBooleans: false,
types: {
flagged: 'boolean',
isOkay: 'boolean',
},
});
//=> {isAdmin: 'true', flagged: true, isOkay: false}
Note: The 'boolean' type also converts '0' and '1' to booleans, and treats valueless keys (e.g. ?flag) as true.
'string': Parse phoneNumber as a string (overriding the parseNumbers option):import queryString from 'query-string';
queryString.parse('?phoneNumber=%2B380951234567&id=1', {
parseNumbers: true,
types: {
phoneNumber: 'string',
}
});
//=> {phoneNumber: '+380951234567', id: 1}
'number': Parse age as a number (even when parseNumbers is false):import queryString from 'query-string';
queryString.parse('?age=20&id=01234&zipcode=90210', {
types: {
age: 'number',
}
});
//=> {age: 20, id: '01234', zipcode: '90210'}
'string[]': Parse items as an array of strings (overriding the parseNumbers option):import queryString from 'query-string';
queryString.parse('?age=20&items=1%2C2%2C3', {
parseNumbers: true,
types: {
items: 'string[]',
}
});
//=> {age: 20, items: ['1', '2', '3']}
'number[]': Parse items as an array of numbers (even when parseNumbers is false):import queryString from 'query-string';
queryString.parse('?age=20&items=1%2C2%2C3', {
types: {
items: 'number[]',
}
});
//=> {age: '20', items: [1, 2, 3]}
'Function': Provide a custom function as the parameter type. The parameter's value will equal the function's return value. When used with array formats (like comma, separator, bracket, etc.), the function is applied to each array element individually.import queryString from 'query-string';
queryString.parse('?age=20&id=01234&zipcode=90210', {
types: {
age: value => value * 2,
}
});
//=> {age: 40, id: '01234', zipcode: '90210'}
// With arrays, the function is applied to each element
queryString.parse('?scores=10,20,30', {
arrayFormat: 'comma',
types: {
scores: value => Number(value) * 2,
}
});
//=> {scores: [20, 40, 60]}
NOTE: Array types (string[], number[]) are ignored if arrayFormat is set to 'none'.
queryString.parse('ids=001%2C002%2C003&foods=apple%2Corange%2Cmango', {
arrayFormat: 'none',
types: {
ids: 'number[]',
foods: 'string[]',
},
}
//=> {ids:'001,002,003', foods:'apple,orange,mango'}
import queryString from 'query-string';
queryString.parse('?age=20&id=01234&zipcode=90210', {
types: {
age: value => value * 2,
}
});
//=> {age: 40, id: '01234', zipcode: '90210'}
Parse the value as a boolean type instead of string type if it's a boolean.
Stringify an object into a query string and sorting the keys.
Supported value types: string, number, bigint, boolean, null, undefined, and arrays of these types. Other types like Symbol, functions, or objects (except arrays) will throw an error.
Type: object
Type: boolean
Default: true
Strictly encode URI components. It uses encodeURIComponent if set to false. You probably don't care about this option.
Type: boolean
Default: true
URL encode the keys and values.
Type: string
Default: 'none'
'bracket': Serialize arrays using bracket representation:import queryString from 'query-string';
queryString.stringify({foo: [1, 2, 3]}, {arrayFormat: 'bracket'});
//=> 'foo[]=1&foo[]=2&foo[]=3'
'index': Serialize arrays using index representation:import queryString from 'query-string';
queryString.stringify({foo: [1, 2, 3]}, {arrayFormat: 'index'});
//=> 'foo[0]=1&foo[1]=2&foo[2]=3'
'comma': Serialize arrays by separating elements with comma:import queryString from 'query-string';
queryString.stringify({foo: [1, 2, 3]}, {arrayFormat: 'comma'});
//=> 'foo=1,2,3'
queryString.stringify({foo: [1, null, '']}, {arrayFormat: 'comma'});
//=> 'foo=1,,'
// Note that typing information for null values is lost
// and `.parse('foo=1,,')` would return `{foo: [1, '', '']}`.
'separator': Serialize arrays by separating elements with a custom character:import queryString from 'query-string';
queryString.stringify({foo: [1, 2, 3]}, {arrayFormat: 'separator', arrayFormatSeparator: '|'});
//=> 'foo=1|2|3'
'bracket-separator': Serialize arrays by explicitly post-fixing array names with brackets and separating elements with a custom character:import queryString from 'query-string';
queryString.stringify({foo: []}, {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> 'foo[]'
queryString.stringify({foo: ['']}, {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> 'foo[]='
queryString.stringify({foo: [1]}, {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> 'foo[]=1'
queryString.stringify({foo: [1, 2, 3]}, {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> 'foo[]=1|2|3'
queryString.stringify({foo: [1, '', 3, null, null, 6]}, {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> 'foo[]=1||3|||6'
queryString.stringify({foo: [1, '', 3, null, null, 6]}, {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|', skipNull: true});
//=> 'foo[]=1||3|6'
queryString.stringify({foo: [1, 2, 3], bar: 'fluffy', baz: [4]}, {arrayFormat: 'bracket-separator', arrayFormatSeparator: '|'});
//=> 'foo[]=1|2|3&bar=fluffy&baz[]=4'
'colon-list-separator': Serialize arrays with parameter names that are explicitly marked with :list:import queryString from 'query-string';
queryString.stringify({foo: ['one', 'two']}, {arrayFormat: 'colon-list-separator'});
//=> 'foo:list=one&foo:list=two'
'none': Serialize arrays by using duplicate keys:import queryString from 'query-string';
queryString.stringify({foo: [1, 2, 3]});
//=> 'foo=1&foo=2&foo=3'
Type: string
Default: ','
The character used to separate array elements when using {arrayFormat: 'separator'}.
Type: Function | boolean
Supports both Function as a custom sorting function or false to disable sorting.
import queryString from 'query-string';
const order = ['c', 'a', 'b'];
queryString.stringify({a: 1, b: 2, c: 3}, {
sort: (a, b) => order.indexOf(a) - order.indexOf(b)
});
//=> 'c=3&a=1&b=2'
import queryString from 'query-string';
queryString.stringify({b: 1, c: 2, a: 3}, {sort: false});
//=> 'b=1&c=2&a=3'
If omitted, keys are sorted using Array#sort(), which means, converting them to strings and comparing strings in Unicode code point order.
Skip keys with null as the value.
Note that keys with undefined as the value are always skipped.
Type: boolean
Default: false
import queryString from 'query-string';
queryString.stringify({a: 1, b: undefined, c: null, d: 4}, {
skipNull: true
});
//=> 'a=1&d=4'
import queryString from 'query-string';
queryString.stringify({a: undefined, b: null}, {
skipNull: true
});
//=> ''
Skip keys with an empty string as the value.
Type: boolean
Default: false
import queryString from 'query-string';
queryString.stringify({a: 1, b: '', c: '', d: 4}, {
skipEmptyString: true
});
//=> 'a=1&d=4'
import queryString from 'query-string';
queryString.stringify({a: '', b: ''}, {
skipEmptyString: true
});
//=> ''
A function that transforms key-value pairs before stringification.
Type: function
Default: undefined
Similar to the replacer parameter of JSON.stringify(), this function is called for each key-value pair and can be used to transform values before they are stringified. The function receives the key and value, and should return the transformed value. Returning undefined will omit the key-value pair from the resulting query string.
This is useful for custom serialization of non-primitive types like Date:
import queryString from 'query-string';
queryString.stringify({
date: new Date('2024-01-15T10:30:00Z'),
name: 'John'
}, {
replacer: (key, value) => {
if (value instanceof Date) {
return value.toISOString();
}
return value;
}
});
//=> 'date=2024-01-15T10%3A30%3A00.000Z&name=John'
You can also use it to filter out keys:
import queryString from 'query-string';
queryString.stringify({
a: 1,
b: null,
c: 3
}, {
replacer: (key, value) => value === null ? undefined : value
});
//=> 'a=1&c=3'
Extract a query string from a URL that can be passed into .parse().
queryString.extract('https://foo.bar?foo=bar');
//=> 'foo=bar'
Extract the URL and the query string as an object.
Returns an object with a url and query property.
If the parseFragmentIdentifier option is true, the object will also contain a fragmentIdentifier property.
import queryString from 'query-string';
queryString.parseUrl('https://foo.bar?foo=bar');
//=> {url: 'https://foo.bar', query: {foo: 'bar'}}
queryString.parseUrl('https://foo.bar?foo=bar#xyz', {parseFragmentIdentifier: true});
//=> {url: 'https://foo.bar', query: {foo: 'bar'}, fragmentIdentifier: 'xyz'}
Type: object
The options are the same as for .parse().
Extra options are as below.
Parse the fragment identifier from the URL.
Type: boolean
Default: false
import queryString from 'query-string';
queryString.parseUrl('https://foo.bar?foo=bar#xyz', {parseFragmentIdentifier: true});
//=> {url: 'https://foo.bar', query: {foo: 'bar'}, fragmentIdentifier: 'xyz'}
Stringify an object into a URL with a query string and sorting the keys. The inverse of .parseUrl()
The options are the same as for .stringify().
Returns a string with the URL and a query string.
Query items in the query property overrides queries in the url property.
The fragmentIdentifier property overrides the fragment identifier in the url property.
queryString.stringifyUrl({url: 'https://foo.bar', query: {foo: 'bar'}});
//=> 'https://foo.bar?foo=bar'
queryString.stringifyUrl({url: 'https://foo.bar?foo=baz', query: {foo: 'bar'}});
//=> 'https://foo.bar?foo=bar'
queryString.stringifyUrl({
url: 'https://foo.bar',
query: {
top: 'foo'
},
fragmentIdentifier: 'bar'
});
//=> 'https://foo.bar?top=foo#bar'
Type: object
Type: string
The URL to stringify.
Type: object
Query items to add to the URL.
Pick query parameters from a URL.
Returns a string with the new URL.
import queryString from 'query-string';
queryString.pick('https://foo.bar?foo=1&bar=2#hello', ['foo']);
//=> 'https://foo.bar?foo=1#hello'
queryString.pick('https://foo.bar?foo=1&bar=2#hello', (name, value) => value === 2, {parseNumbers: true});
//=> 'https://foo.bar?bar=2#hello'
Exclude query parameters from a URL.
Returns a string with the new URL.
import queryString from 'query-string';
queryString.exclude('https://foo.bar?foo=1&bar=2#hello', ['foo']);
//=> 'https://foo.bar?bar=2#hello'
queryString.exclude('https://foo.bar?foo=1&bar=2#hello', (name, value) => value === 2, {parseNumbers: true});
//=> 'https://foo.bar?foo=1#hello'
Type: string
The URL containing the query parameters to filter.
Type: string[]
The names of the query parameters to filter based on the function used.
Type: (key, value) => boolean
A filter predicate that will be provided the name of each query parameter and its value. The parseNumbers and parseBooleans options also affect value.
Type: object
Parse options and stringify options.
This module intentionally doesn't support nesting as it's not spec'd and varies between implementations, which causes a lot of edge cases.
You're much better off just converting the object to a JSON string:
import queryString from 'query-string';
queryString.stringify({
foo: 'bar',
nested: JSON.stringify({
unicorn: 'cake'
})
});
//=> 'foo=bar&nested=%7B%22unicorn%22%3A%22cake%22%7D'
However, there is support for multiple instances of the same key:
import queryString from 'query-string';
queryString.parse('likes=cake&name=bob&likes=icecream');
//=> {likes: ['cake', 'icecream'], name: 'bob'}
queryString.stringify({color: ['taupe', 'chartreuse'], id: '515'});
//=> 'color=taupe&color=chartreuse&id=515'
Sometimes you want to unset a key, or maybe just make it present without assigning a value to it. Here is how falsy values are stringified:
import queryString from 'query-string';
queryString.stringify({foo: false});
//=> 'foo=false'
queryString.stringify({foo: null});
//=> 'foo'
queryString.stringify({foo: undefined});
//=> ''
+ as a space?See this answer.