Solución:
He estado revisando los documentos de jQuery y creo que podemos hacer esto en una línea usando selectores:
$("#myForm :input[value!='']").serialize() // does the job!
Obviamente #myForm obtiene el elemento con id “myForm” pero lo que fue menos obvio para mí al principio fue que el personaje espacial se necesita entre #myForm y: input ya que es el operador descendiente.
:aporte coincide con todos los elementos de entrada, área de texto, selección y botón.
[value!=”] es un atributo que no es un filtro igual. Lo extraño (y útil) es que todo: entrada los tipos de elementos tienen atributos de valor, incluso selecciones y casillas de verificación, etc.
Finalmente, para eliminar también las entradas donde el valor era ‘.’ (como se menciona en la pregunta):
$("#myForm :input[value!=''][value!='.']").serialize()
En este caso, la yuxtaposición, es decir, colocar dos selectores de atributos uno al lado del otro, implica un AND. Usar una coma implica un OR. ¡Lo siento si eso es obvio para la gente de CSS!
No pude hacer que la solución de Tom funcionara (?), Pero pude hacer esto usando .filter()
con una función corta para identificar campos vacíos. Estoy usando jQuery 2.1.1.
var formData = $("#formid :input")
.filter(function(index, element) {
return $(element).val() != '';
})
.serialize();
Podrías hacerlo con una expresión regular …
var orig = $('#myForm').serialize();
var withoutEmpties = orig.replace(/[^&]+=.?(?:&|$)/g, '')
Casos de prueba:
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