【问题标题】: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

【讨论】:

  • 很好的答案。这里唯一的问题是它只兼容 ES6?
【解决方案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);

    【讨论】:

      【解决方案4】:

      是的 - 使用库而不是尝试做任何复杂的事情。我推荐 URIJS,它是这样的:

      var uri = new URI("https://www.example.com?budget=0-&year=0-&kms=0-&so=-1&sc=-1&pn=1");
      uri.removeSearch(["so", "kms", "pn"]);
      alert( uri.toString() );
      

      详情请见https://medialize.github.io/URI.js/docs.html#search-remove

      【讨论】:

        【解决方案5】:

        旧帖子,但这是我更清洁的解决方案。我正在使用lodashquery-string 库。

        import qs from "query-string";
        import _ from "lodash";
        
        let query = qs.parse(location.search);
        
        _.map(query, function(value, key) {
                return delete query[key];
              });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-28
          • 2019-08-09
          • 2011-03-28
          • 2011-07-28
          • 1970-01-01
          • 2013-09-02
          相关资源
          最近更新 更多