从URL中删除重复参数

时间:2015-06-26 13:57:29

标签: javascript

我正在尝试从网址中删除重复的查询字符串参数。我做错了什么?

function stripUrlParams(url, parameter) {
    //prefer to use l.search if you have a location/link object
    var urlparts= url.split('?');   
    if (urlparts.length>=2) {

        var prefix= encodeURIComponent(parameter)+'=';
        var pars= urlparts[1].split(/[&;]/g);

        //reverse iteration as may be destructive
        for (var i= pars.length; i-- > 0;) {    
            //idiom for string.startsWith
            if (pars[i].lastIndexOf(prefix, 0) !== -1) {  
                pars.splice(i, 1);
            }
        }

        url = urlparts[0] + '?' + pars.join('&');
        return url;
    } else {
        return url;
    }
}

stripUrlParams( 'www.testurl.com?x=1&y=2&x=2'); //应返回“www.testurl.com?x=1&y=2”。

http://jsfiddle.net/marcusdei/LnzsoLot/1/

4 个答案:

答案 0 :(得分:2)

试试这个:

function stripUrlParams(url, parameter) {
    //prefer to use l.search if you have a location/link object
    var urlparts= url.split('?');   
    if (urlparts.length>=2) {

        var stuff = urlparts[1];
        pars = stuff.split("&");
        var comps = {};
        for (i = pars.length - 1; i >= 0; i--)
        {
            spl = pars[i].split("=");
            comps[spl[0]] = spl[1];
        }
        pars = [];
        for (var a in comps)
            pars.push(a + "=" + comps[a]);
        url = urlparts[0] + '?' + pars.join('&');
        return url;
    } else {
        return url;
    }
}

document.getElementById('choice').innerHTML = stripUrlParams('www.testurl.com?x=1&y=2&x=2');
//Should return "www.testurl.com?x=1&y=2".

小提琴:http://jsfiddle.net/praveenscience/n8497sqL/

答案 1 :(得分:0)

在var var prefix= encodeURIComponent(parameter)+'=';中,parameter未定义。

尝试为它提供一个值,这可能会通过在函数调用中添加第二个参数来解决您的问题:

stripUrlParams('www.testurl.com?x=1&y=2&x=2', '');

答案 2 :(得分:0)

问题是:您的函数不会删除重复的URL参数,只是在您调用它时删除传递给该方法的stripUrlParams('www.testurl.com?x=1&y=2&x=2', 'x');

例如调用

x

将从网址中删除所有public class MoveablePane extends Pane { private ScrollPane scrollArea; private Node contentNode; public MoveablePane (String title, Node contentNode) { this.contentNode = contentNode; //Set up the title bar //Set up the window buttons //Place the node into the scroll area so the user can resize this.scrollArea = new ScrollPane(contentNode); //Add the nodes to be layed out on the stage this.getChildren().clear(); this.getChildren().addAll(scrollArea); } 个参数。当您第二次遇到它们时,您必须跟踪您的URL中已有的参数并将其删除(或不将其复制)。已经在其他答案中提供了可能的解决方案。

答案 3 :(得分:0)

来自@Praveen Kumar的上述解决方案很好但是如果传递了多选值或数组,它将无法正确处理。

所以我在这里写了一个函数,几乎没有变化,函数将用于URI而不是完整的URL,只需将此部分传递给此函数x=1&y=2

function stripUriParams(uri) {
    var stuff = decodeURIComponent(uri);
    var pars = stuff.split("&");
    var finalPars = [];
    var comps = {};
    for (var i = pars.length - 1; i >= 0; i--)
    {
        spl = pars[i].split("=");
        //ignore arrays
        if(!spl[0].endsWith(']')) {
            comps[spl[0]] = spl[1];
        } else {
            //this is array so enter it into final url array
            finalPars.push(spl[0] + "=" + spl[1]);
        }
    }
    for (var a in comps)
        finalPars.push(a + "=" + comps[a]);
    url = finalPars.join('&');
    return url;
}

输入:

stripUriParams('pr1=2&pr1=3&pr2=1&arr[]=1&arr[]=2');

输出:

pr1=2&pr2=1&arr[]=1&arr[]=2
Whereas the output of Parveen's function would be something like 
pr1=2&pr2=1&arr[]=1

PS)为什么我没有编辑上面的答案,因为我修改了URI而不是完整的URL。