const encode = encodeURIComponent;
const decode = decodeURIComponent;
class Query {
// 解析字符串为字典格式
resolveQuery(query = window.location.href, extraQuery = {}) {
if (query) {
let parsedQuery = {};
let index = query.indexOf('?');
query = index !== -1 ? query.slice(query.indexOf('?') + 1) : '';
query = query.replace(/(\?|\#\/)/g, '&');
try {
parsedQuery = this.parsedQuery(query);
} catch (e) {
parsedQuery = {};
}
for (let key in extraQuery) {
parsedQuery[key] = extraQuery[key];
}
return parsedQuery;
} else {
return extraQuery;
}
}
stringifyQuery(obj) {
const res = obj
? Object.keys(obj)
.sort()
.map((key) => {
const val = obj[key];
if (val === undefined) {
return '';
}
if (val === null) {
return encode(key);
}
if (Array.isArray(val)) {
const result = [];
val.slice().forEach((val2) => {
if (val2 === undefined) {
return;
}
if (val2 === null) {
result.push(encode(key));
} else {
result.push(encode(key) + '=' + encode(val2));
}
});
return result.join('&');
}
return encode(key) + '=' + encode(val);
})
.filter((x) => x.length > 0)
.join('&')
: null;
return res ? `?${res}` : '';
}
parsedQuery(query) {
const res = {};
query = query.trim().replace(/^(\?|#|&)/, '');
if (!query) {
return res;
}
query.split('&').forEach((param) => {
const parts = param.replace(/\+/g, ' ').split('=');
const key = decode(parts.shift());
const val = parts.length > 0 ? decode(parts.join('=')) : '';
if (key === '') {
return false;
}
if (res[key] === undefined) {
res[key] = val;
} else if (Array.isArray(res[key])) {
res[key].push(val);
} else {
res[key] = [res[key]].concat(val);
}
});
return res;
}
}
const handleQuery = new Query();
export { handleQuery };
网友评论