How do I use jQuery’s form.serialize but exclude empty fields

How do I use jQuery’s form.serialize but exclude empty fields

I have a search form with a number of text inputs & drop downs that submits via a GET. I’d like to have a cleaner search url by removing the empty fields from the querystring when a search is performed.
var form = $(“form”);
var serializedFormStr = form.serialize();
// I’d like to remove inputs where value is ” or ‘.’ here
window.location.href = ‘/search?’ + serializedFormStr

Any idea how I can do this using jQuery?


Solution 1:

I’ve been looking over the jQuery docs and I think we can do this in one line using selectors:

$("#myForm :input[value!='']").serialize() // does the job!

Obviously #myForm gets the element with id “myForm” but what was less obvious to me at first was that the space character is needed between #myForm and :input as it is the descendant operator.

:input matches all input, textarea, select and button elements.

[value!=”] is an attribute not equal filter. The weird (and helpful) thing is that all :input element types have value attributes even selects and checkboxes etc.

Finally to also remove inputs where the value was ‘.’ (as mentioned in the question):

$("#myForm :input[value!=''][value!='.']").serialize()

In this case juxtaposition, ie placing two attribute selectors next to each other, implies an AND. Using a comma implies an OR. Sorry if that’s obvious to CSS people!

Solution 2:

I wasn’t able to get Tom’s solution to work (?), but I was able to do this using .filter() with a short function to identify empty fields. I’m using jQuery 2.1.1.

var formData = $("#formid :input")
    .filter(function(index, element) {
        return $(element).val() != '';

Solution 3:

This works for me:

data = $( "#my_form input").filter(function () {
        return !!this.value;

Solution 4:

You could do it with a regex…

var orig = $('#myForm').serialize();
var withoutEmpties = orig.replace(/[^&]+=\.?(?:&|$)/g, '')

Test cases:

orig = "a=&b=.&c=&d=.&e=";
new => ""

orig = "a=&b=bbb&c=.&d=ddd&e=";
new => "b=bbb&d=ddd&"  // dunno if that trailing & is a problem or not

Solution 5:

I have used above solution but for me those did not worked. So I have used following code


            var serializedData = $(this).serializeArray();
            var query_str = '';

            $.each(serializedData, function(i,data){
                    query_str += (query_str == '') ? '?' + data['name'] + '=' + data['value'] : '&' + data['name'] + '=' + data['value'];
            return false;

May be useful for someone

Solution 6:

I would look at the source code for jQuery.
In the latest version line 3287.

I might add in a “serialize2” and “serializeArray2” functions.
of course name them something meaniful.

Or the better way would be to write something to pull the unused vars out of the serializedFormStr. Some regex that looks for =& in mid string or ending in =
Any regex wizards around?

I like rogeriopvl’s answer better (+1)… especially since I can’t find any good regex tools right now.