¿Cómo convertiría dinámicamente los campos de formulario en un objeto js multidimensional?

Estoy luchando para convertir dinámicamente un conjunto de entradas en un objeto multidimensional para pasar una llamada ajax.

Supongamos que tengo una persona, con múltiples direcciones. Mis campos actualmente se ven así:

   

¿Cómo se convertirían mis campos en un objeto ab que se parece a esto?

 Person : { name: 'Bradley', addresses: { home: '123 Anywhere Drive.', work: '456 anywhere Road.' } } 

Necesito hacer esto dinámicamente (la función debe funcionar independientemente de las entradas proporcionadas) y trabajar a N profundidad.

(Nota: jQuery disponible).

http://jsfiddle.net/w4Wqh/1/

Sinceramente, creo que hay una manera de hacer esto en una expresión regular … pero no pude resolverlo. Por lo tanto, es un poco de manipulación de cadena fea. De cualquier manera, esto debería ponerlo en el camino correcto, creo:

 function serialize () { var serialized = {}; $("[name]").each(function () { var name = $(this).attr('name'); var value = $(this).val(); var nameBits = name.split('['); var previousRef = serialized; for(var i = 0, l = nameBits.length; i < l; i++) { var nameBit = nameBits[i].replace(']', ''); if(!previousRef[nameBit]) { previousRef[nameBit] = {}; } if(i != nameBits.length - 1) { previousRef = previousRef[nameBit]; } else if(i == nameBits.length - 1) { previousRef[nameBit] = value; } } }); return serialized; } console.log(serialize()); 

Explicación rápida. Esto simplemente agarra cualquier cosa con un atributo 'nombre', y luego itera sobre ellos. Para cada iteración, toma el nombre y lo divide en '['. Básicamente, esto te lleva hasta qué punto del objeto necesitas poner las cosas. Entonces, para Persona [direcciones] [trabajo], obtendría Persona, direcciones], trabajo].

Luego, está la parte difícil. Dado que los objetos siempre se pasan por referencia, podemos ver si la variable serializada tiene 'Persona'. Si no es así, lo agrega y establece el valor en un objeto vacío ... que es lo suficientemente genérico para ser utilizado para almacenar más cosas, o reemplazado si es necesario. Si no hay más niveles por los que debamos pasar, solo toma el valor del elemento y lo asigna a la referencia que tiene. De lo contrario, el código toma una referencia a lo que acaba de hacer, y vuelve a realizar un bucle, realizando la misma operación. Entonces, para Persona [direcciones] [trabajo] ..

  1. ¿Existe serialized.Person existe? No. Configuración serializada. Personal a {}. Este no es el final del bucle, almacene la referencia a serialized.Person como previousRef.
  2. ¿Existe anteriorRef.addresses? (serialized.Person.addresses) No. Configurando previousRef.addresses en {}. Este no es el final del bucle, almacene la referencia a previousRef.addresses como previousRef.
  3. ¿Existe previousRef.work? (serialized.Person.addresses.work) No. Configurando previousRef.work en {}. Espera Este es el final del bucle. Estableciendo previousRef.work al valor en el elemento.