如何将表单字段动态转换为多维js对象?

我正在努力将一组输入动态转换为多维对象以传入ajax调用。

假设我有一个Person,有多个地址。 我的字段目前看起来像这样:

   

如何将我的字段转换为如下所示的ab对象:

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

我需要动态地执行此操作(无论所提供的输入如何,函数都需要工作)并在N深度工作。

(注意:jQuery可用)。

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

老实说,我认为有一种方法可以在正则表达式中做到这一点..但我无法弄明白。 所以,这是一个丑陋的字符串操作。 无论哪种方式,我认为这应该让你走上正确的轨道:

 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()); 

快速解释。 这只是用'name'属性抓取任何东西,然后迭代它们。 对于每次迭代,它抓取名称并将其拆分为“[”。 这基本上可以让您了解物品需要放置多远。 所以,对于Person [地址] [工作],你会得到人,地址],工作]。

然后,这是棘手的部分。 由于对象总是通过引用传递,我们可以看到序列化变量中是否包含“Person”。 如果没有,它会添加它,并将值设置为空对象..它通用,足以用于存储更多内容,或者在必要时替换。 如果没有我们需要经历的更多级别,它只需要获取元素的值并将其分配给它具有的引用。 否则,代码会抓取对其刚刚创建的内容的引用,并再次循环,执行相同的操作。 那么,对于Person [地址] [工作] ..

  1. serialized.Person存在吗? 编号设置serialized.Person到{}。 这不是循环的结束,将serialized.Person的存储引用存储为previousRef。
  2. previousRef.addresses是否存在? (serialized.Person.addresses)否。将previousRef.addresses设置为{}。 这不是循环的结束,将previousRef.addresses的存储引用存储为previousRef。
  3. previousRef.work是否存在? (serialized.Person.addresses.work)编号。将previousRef.work设置为{}。 等等 这是循环的结束。 将previousRef.work设置为元素中的值。