- // If jQuery.param.traditional is set, encode the "old" way (the way
- // 1.3.2 or older did it), otherwise encode params recursively.
- jQuery.each( a, buildParams );
+ // If jQuery.param.traditional is true, encode the "old" way (the
+ // way 1.3.2 or older did it), otherwise encode params recursively.
+ jQuery.each( a, function buildParams( prefix, obj ) {
+
+ if ( jQuery.isArray(obj) ) {
+ // Serialize array item.
+ jQuery.each( obj, function(i,v){
+ if ( traditional ) {
+ // Treat each array item as a scalar.
+ add( prefix, v );
+ } else {
+ // If array item is non-scalar (array or object), encode its
+ // numeric index to resolve deserialization ambiguity issues.
+ // Note that rack (as of 1.0.0) can't currently deserialize
+ // nested arrays properly, and attempting to do so may cause
+ // a server error. Possible fixes are to modify rack's
+ // deserialization algorithm or to provide an option or flag
+ // to force array serialization to be shallow.
+ buildParams( prefix + "[" + ( typeof v === "object" || jQuery.isArray(v) ? i : "" ) + "]", v );
+ }
+ });
+
+ } else if ( !traditional && typeof obj === "object" ) {
+ // Serialize object item.
+ jQuery.each( obj, function(k,v){
+ buildParams( prefix + "[" + k + "]", v );
+ });
+
+ } else {
+ // Serialize scalar item.
+ add( prefix, obj );
+ }
+ });