url-query-set
Version:
Set query or search params to a url link.
120 lines (98 loc) • 2.87 kB
JavaScript
/**
* Author novbing@foxmail.com
*/
(function () {
'use strict';
function getGlobalRoot() {
var G = {};
if (typeof window !== 'undefined') {
G = window;
} else if (typeof global !== 'undefined') {
G = global;
}
return G;
}
function querySet(link, queryMap) {
var G = getGlobalRoot();
var tempLink;
var hasProtol = /^\w+:\/\//.test(link);
function splitSearchString(searchString) {
var searchParams = {};
if (typeof searchString === 'string' && searchString !== '') {
searchString
.replace(/^\?/, '')
.split('&')
.forEach(function (v) {
var sp = v.split('=');
if (sp[0]) {
searchParams[sp[0]] = sp[1] || '';
}
});
}
return searchParams;
}
function setSearchQuery(searchParams, queryMap) {
var params = searchParams || {};
for (var key in queryMap) {
params[key] = queryMap[key];
}
return params;
}
function joinSearchParams(searchParams) {
var params = searchParams || {};
var entries = [];
for (var key in params) {
entries.push([key, params[key]]);
}
return entries
.map(function (v, i, a) {
let str = '';
if (v[1] instanceof Array || v[1] instanceof Object) {
str = decodeURIComponent(JSON.stringify(v[1]));
} else {
str = decodeURIComponent(v[1]);
}
return v[0] + '=' + encodeURIComponent(str);
})
.join('&');
}
function splitAndJoinParams(searchString, queryMap) {
var temp = splitSearchString(searchString);
temp = setSearchQuery(temp, queryMap);
temp = joinSearchParams(temp);
return temp !== '' ? '?' + temp : temp;
}
if (typeof G.URL === 'function' && hasProtol) {
tempLink = new G.URL(link);
if (tempLink.searchParams) {
for (var key in queryMap) {
tempLink.searchParams.set(key, queryMap[key]);
}
return tempLink.href;
}
}
if (typeof G.document === 'object' && hasProtol) {
tempLink = document.createElement('a');
tempLink.href = link;
tempLink.search = splitAndJoinParams(tempLink.search, queryMap);
if (
tempLink.href.indexOf('?') !== -1 &&
(tempLink.search === '' || tempLink.search === '?')
) {
return tempLink.href.replace('?', '');
} else {
return tempLink.href;
}
} else {
tempLink = link.split(/^([^?#]*)(\?[^?#]*)?(#[^?#]*)?(.*)$/gi);
tempLink[2] = splitAndJoinParams(tempLink[2], queryMap);
return tempLink.join('');
}
}
var G = getGlobalRoot();
if (typeof module !== 'undefined') {
module.exports = querySet;
} else {
G.querySet = querySet;
}
})();