【问题标题】:Remove all query string in bulk from url?从网址中批量删除所有查询字符串?
【发布时间】:2017-09-19 13:01:09
【问题描述】:
我们想从给定的 url 中删除多个查询字符串参数。例如:
如果网址是:
https://www.example.com?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1
和
如果要删除的查询字符串参数是:“so”、“kms”、“pn”,则该函数的输出应该是:
https://www.example.com?budget=0-&year=0-&sc=-1
我们为此编写了以下代码:
var input = "https://www.example.com?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1";
var url = input.replace('?', '');
var removeFilterSet = {"so" : true,"kms" : true,"pn" : true};
var params = url.split("&");
for(var i = params.length ; i-- > 0 ; )
{
if(removeFilterSet[params[i].split("=")[0]])
{
params.splice(i,1);
}
}
alert(params.join("&"));
有没有更好的方法从url中批量删除查询字符串?
【问题讨论】:
标签:
javascript
query-string
ecmascript-5
【解决方案1】:
为此可以使用地图:
const url = "https://www.example.com?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1";
//divide the url into domain and query
const [domain,query] = url.split("?");
//build a Map out of the query string
const params = new Map(
query.split("&").map(el=>el.split("="))
);
//modification goes here, e.g:
["year","so","sc","pm"].forEach(q => params.delete(q));
/* or to replace a value
params.set("whatever","value")
*/
//build up again:
const result = domain+"?"+[...params].map(el=>el.join("=")).join("&");
Try it
【解决方案2】:
您可以使用这段代码,使用大部分split() 函数来达到预期的目标:
var input = "https://www.example.com?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1";
var domain = input.split("?")[0];
var queryStrings = input.split("?")[1].split('&');
var removeFilterSet = {"so" : true,"kms" : true,"pn" : true};
var resArray = [];
queryStrings.forEach(function(value, key){
var queryName = value.split('=')[0];
if(!removeFilterSet[queryName]){
resArray.push(value);
}
});
var finalUrl = domain+'?'+resArray.toString().replace(/,/g,'&');
console.log(finalUrl);
【解决方案3】:
这里是使用Array.prototype.reduce()的解决方案:
let input = "https://www.example.com?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1",
[domain, qs] = input.split('?'),
removeFilterSet = ['so', 'kms', 'pn'],
filtered = qs.split('&').reduce((acc, param) => {
return removeFilterSet.includes(param.split('=')[0]) ?
acc : `${acc}&${param}`;
}, '');
console.log(domain + '?' + filtered);
【解决方案5】:
旧帖子,但这是我更清洁的解决方案。我正在使用lodash 和query-string 库。
import qs from "query-string";
import _ from "lodash";
let query = qs.parse(location.search);
_.map(query, function(value, key) {
return delete query[key];
});