1

我需要从中获得价值形式,将其格式化为JSON并通过AJAX发布。这是我想要实现的格式:

{项目:[{id:7,名称:'Book',价格:5.7},{id:5,名称:'铅笔',价格:2.5}]}

以下是HTML:

(函数($){var$form=$('form');//serializeArray格式与我需要的格式相去甚远var rawData=$form.serializeArray();console.log(rawData)})(jQuery);
<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js“></script><表格><字段集><h2>产品1</h2><input type=“hidden”name=“items[0][id]”value=“7”><input type=“text”name=“items[0][name]”value=“Book”><输入type=“number”name=“items[0][price]”value=“5.7”></fieldset><字段集><h2>产品2</h2><input type=“hidden”name=“items[1][id]”value=“5”><input type=“text”name=“items[1][name]”value=“Pencil”><输入type=“number”name=“items[1][price]”value=“2.5”></fieldset></form>

我应该循环并使用regex来解析名称? 还是有内置方式?

我可以更改<表格>格式(如果需要)。

2
  • 不,我的意思是,我想从输入中获取所有数据来形成JSON。我需要通过Ajax发布它。我将编辑问题以使其更清楚 评论 2016年8月23日4:58
  • 序列化在这里不起作用,您需要手动执行 评论 2016年8月23日5:18

3个答案

重置为默认值
2

请看一下这种方法。我们不能只使用$.serializeArray()但我们还需要一些自定义代码,如下所示。实际上我们需要遍历所有<字段集>根据需要获取JSON:

(函数($){var$form=$('form');var fieldSets=$form.find(“fieldset”);var结果={项目:[]};fieldSets.each(函数(){var字段={};$.each($(this).serializeArray(),function(){字段[this.name]=this.value;});result.items.push(字段);});console.log(结果);})(jQuery);
<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js“></script><表格><字段集><h2>产品1</h2><输入type=“hidden”name=“id”value=“7”><input type=“text”name=“name”value=“Book”><input type=“number”name=“price”value=“5.7”>输入类型=“number”name=“price”value=“5.7”></fieldset><字段集><h2>产品2</h2><输入type=“hidden”name=“id”value=“5”><input type=“text”name=“name”value=“Pencil”><input type=“number”name=“price”value=“2.5”></fieldset></form>

注:将HTML修改为name=“项目[0][id]”我已经给了name=“id”

1
  • 谢谢,这似乎是更简单的解决方案。 评论 2016年8月23日6:28
2

您不能在这里使用默认的序列化,相反,您可以像这样进行手动序列化

(函数($){var$fieldsets=$('form fieldset');var项=$fieldsets.map(函数(i,fs){变量obj={};$(fs).find('input').each(function(){obj[this.name.match(/\[([^\[]*)\]$/)[1]=this.value;});返回对象;}).get();var原始数据={项目:项目};console.log(rawData)})(jQuery);
<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js“></script><表格><字段集><h2>产品1</h2><input type=“hidden”name=“items[0][id]”value=“7”><input type=“text”name=“items[0][name]”value=“Book”><输入type=“number”name=“items[0][price]”value=“5.7”></fieldset><字段集><h2>产品2</h2><input type=“hidden”name=“items[1][id]”value=“5”><input type=“text”name=“items[1][name]”value=“Pencil”><输入type=“number”name=“items[1][price]”value=“2.5”></fieldset></form>

1

是的,您需要解析名称自己动手。没有自动解析自定义字段的方法。当然,有多种方法可以做到这一点。

注:我假设您的name=“项目[0][id]”字段指定这必须是结果数组中的第0项,并且此类<输入>字段不一定按DOM中的#项升序排列。换句话说项目[N]应该控制它是Qth<字段集>在中<表格>.

你可以使用序列化数组()然后处理该数据:

(函数($){var$form=$('form');var数据=$form.serializeArray();var结果={items:[]};data.forEach(函数(输入){nameArray=input.name.split(/[\]]/);item=nameArray[1];prop=名称数组[3];if(typeofresult.items[item]!=='object'){result.items[item]={};}if(typeof result.items[item][prop]!==“未定义”){//名称属性的一致性检查console.log('警告重复的“name”属性='+input.name);}result.items[item][prop]=输入值;});console.log(结果);})(jQuery);
<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js“></script><表格><字段集><h2>产品1</h2><input type=“hidden”name=“items[0][id]”value=“7”><input type=“text”name=“items[0][name]”value=“Book”><输入type=“number”name=“items[0][price]”value=“5.7”></fieldset><字段集><h2>产品2</h2><input type=“hidden”name=“items[1][id]”value=“5”><input type=“text”name=“items[1][name]”value=“Pencil”><输入type=“number”name=“items[1][price]”value=“2.5”></fieldset></form>

或者,您可以直接从DOM处理它:

(函数($){var结果={items:[]};$('表单字段集输入').each(function(){nameArray=this.name.split(/[\]]/);item=nameArray[1];prop=名称数组[3];if(typeof result.items[item]!==“对象”){result.items[item]={};}if(typeof result.items[item][prop]!==“未定义”){//名称属性的一致性检查console.log('警告重复“name”属性='+this.name);}result.items[item][prop]=this.value;});console.log(结果);})(jQuery);
<script src=“https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js“></script><表格><字段集><h2>产品1</h2><input type=“hidden”name=“items[0][id]”value=“7”><input type=“text”name=“items[0][name]”value=“Book”><输入type=“number”name=“items[0][price]”value=“5.7”></fieldset><字段集><h2>产品2</h2><input type=“hidden”name=“items[1][id]”value=“5”><input type=“text”name=“items[1][name]”value=“Pencil”><输入type=“number”name=“items[1][price]”value=“2.5”></fieldset></form>

4
  • 你为什么认为这个解决方案对OP有帮助? 评论 2016年8月23日5:14
  • 谢谢你的回答。这个项目[0]只是避免重复名称的示例。我想可以使用重复的名称,就像身份证件名称喜欢vijayP的回答 评论 2016年8月23日6:32
  • @DarcCode,谢谢。对于名称要复制的属性(可用于对元素进行分组)(例如按名称获取元素()). 另一次,请在问题中提及HTML可以更改。当我读到这个问题时,我假设您正在尝试使用JavaScript来获得基于HTML的所需JSON,而HTML的格式与此完全相同。从编写方式来看,这种假设和vijayP的假设(HTML可以方便地更改)都是有效的。在问题中指出哪种情况有助于人们为你提供更好的答案。
    – 马延
    评论 2016年8月23日7:20
  • @Makyen谢谢你的建议,下次我提出问题时,我会给出更多细节。 评论 2016年8月23日8:26

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.