Join the segments of a URL using JavaScript

When building URLs programmatically, it's often necessary to join the segments of a URL together. While seemingly simple, there are many nuances and edge cases you need to take care of. Luckily, approaching this step-by-step can help you build a robust solution.
The first step is simply joining the segments together. This can be done using the Array.prototype.join()
method with a slash ('/'
) as the separator. This will join the segments together, but it won't handle any normalization of the resulting URL.
Normalizing the URL can then be done via a series of String.prototype.replace()
calls with various regular expressions. This will remove double slashes, add proper slashes for the protocol, remove slashes before parameters, combine parameters with '&'
, and normalize the first parameter delimiter.
Putting everything together, you can create a function that joins the segments of a URL and normalizes the resulting URL.
const joinURL = (...args) =>
args
.join('/')
.replace(/[\/]+/g, '/')
.replace(/^(.+):\//, '$1://')
.replace(/^file:/, 'file:/')
.replace(/\/(\?|&|#[^!])/g, '$1')
.replace(/\?/g, '&')
.replace('&', '?');
joinURL('http://www.google.com', 'a', '/b/cd', '?foo=123', '?bar=foo');
// 'http://www.google.com/a/b/cd?foo=123&bar=foo'