JavaScript
const getUrlParams = (query) =>
Array.from(new URLSearchParams(query))
.reduce((p, [k, v]) => Object.assign({}, p, { [k]: p[k] ? (Array.isArray(p[k]) ? p[k] : [p[k]]).concat(v) : v }), {})
TypeScript
const getUrlParams = (query: string): Record<string, string> =>
Array.from(new URLSearchParams(query)).reduce((p, [k, v]) => Object.assign({}, p, { [k]: p[k] ? (Array.isArray(p[k]) ? p[k] : [p[k]]).concat(v) : v }), {} as Record<string, string>)
Examples
getUrlParams(location.search)
getUrlParams('foo=Foo&bar=Bar')
getUrlParams('foo=Foo&foo=Fuzz&bar=Bar')