Marco V
Marco V

Reputation: 2623

Strip duplicate parameters from the url

I am trying to strip duplicate query string parameters from the url. What am I doing wrong?

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'); //Should return "www.testurl.com?x=1&y=2".

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

Upvotes: 1

Views: 2871

Answers (4)

Imran Zahoor
Imran Zahoor

Reputation: 2787

The above solution from @Praveen Kumar is good but its will not correctly handle if the multi-selection values or arrays are passed.

So I'm writing here a function with little changes the function is to be used with URI instead of full URL, just pass this part to this function 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;
}

Input:

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

Output:

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) Why I didn't edit the above answer because I modified it for URIs instead of full URL.

Upvotes: 0

user1438038
user1438038

Reputation: 6059

The problem is: Your function does not remove duplicate URL arguments, it simply removes the parameter you pass to the method when you call it.

For example calling

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

will strip all x parameters from the URL. You'll have to keep track of parameters that are in your URL already and remove them (or not copy them over), when you come across them a second time. Possible solutions have been provided in other answers already.

Upvotes: 0

Praveen Kumar Purushothaman
Praveen Kumar Purushothaman

Reputation: 167172

Try this:

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".

Fiddle: http://jsfiddle.net/praveenscience/n8497sqL/

Upvotes: 2

Magicprog.fr
Magicprog.fr

Reputation: 4100

In your var var prefix= encodeURIComponent(parameter)+'=';, parameter is undefined.

Try to provide a value for it, and this will probably solve your issue by adding your 2nd param in your function call:

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

Upvotes: 0

Related Questions