我一直在寻找这个小时,却没有找到答案。在燃烧之前,请仔细阅读整个问题!:)
我有类似这样的表格:
<form id="sample"> <input name="name" type="text" value="name value" /> <input name="phone[0][type]" type="text" value="cell" /> <input name="phone[0][number]" type="text" value="000" /> <input name="phone[1][type]" type="text" value="home" /> <input name="phone[1][number]" type="text" value="111" /> </form>
并且需要能够将其序列化为:
{ name: 'name value', phone: [ { type: 'cell', number: '000' }, { type: 'home', number: '111' } ] }
我在SO上尝试过大多数答案,包括jquery-json库,并且大多数返回如下所示:
{ 'name': 'name value', 'phone[0][type]': 'cell', 'phone[0][number]': '000', 'phone[1][type]': 'home', 'phone[1][number]': '111', }
这是 我不能使用的 东西!:P
提前谢谢大家。
试试我为您编写的这段代码…仅使用您的数据结果,对我来说效果很好。您可以对其进行处理,并制作一个简单的jQuery插件…
该示例需要JSON.stringify才能正常工作。
var d = { 'name': 'name value', 'phone[0][type]': 'cell', 'phone[0][number]': '000', 'phone[1][type]': 'home', 'phone[1][number]': '111', }; $(document).ready(function(){ arrangeJson(d); alert(JSON.stringify(d)); }); function arrangeJson(data){ var initMatch = /^([a-z0-9]+?)\[/i; var first = /^\[[a-z0-9]+?\]/i; var isNumber = /^[0-9]$/; var bracers = /[\[\]]/g; var splitter = /\]\[|\[|\]/g; for(var key in data) { if(initMatch.test(key)){ data[key.replace(initMatch,'[$1][')] = data[key]; } else{ data[key.replace(/^(.+)$/,'[$1]')] = data[key]; } delete data[key]; } for (var key in data) { processExpression(data, key, data[key]); delete data[key]; } function processExpression(dataNode, key, value){ var e = key.split(splitter); if(e){ var e2 =[]; for (var i = 0; i < e.length; i++) { if(e[i]!==''){e2.push(e[i]);} } e = e2; if(e.length > 1){ var x = e[0]; var target = dataNode[x]; if(!target){ if(isNumber.test(e[1])){ dataNode[x] = []; } else{ dataNode[x] ={} } } processExpression(dataNode[x], key.replace(first,''), value); } else if(e.length == 1){ dataNode[e[0]] = value; } else{ alert('This should not happen...'); } } } }