序列化表单数据时保留分组

时间:2017-01-18 04:02:07

标签: javascript jquery html serialization form-data

我有一个包含类似输入元素组的HTML表单。

如何在保留分组的同时序列化表单数据,而无需迭代输入元素?

如果有必要实现目标,我可以更改表单结构。

示例输入:

<form id="form">
  <div>
    <input name="id" value="1" type="hidden">
    <input name="quantity" value="10">
  </div>
  <div>
    <input name="id" value="2" type="hidden">
    <input name="quantity" value="20">
  </div>
  <div>
    <input name="id" value="3" type="hidden">
    <input name="quantity" value="30">
  </div>
</form>

预期输出:

{
  "1": { "id": "1","quantity": "10" },
  "2": { "id": "2","quantity": "20" },
  "3": { "id": "3","quantity": "30" }
}

我试过了:

console.log($('#form').serializeArray());

但表单数据未分组:

[
  {"name":"id","value":"1"},{"name":"quantity","value":"10"},
  {"name":"id","value":"2"},{"name":"quantity","value":"20"},
  {"name":"id","value":"3"},{"name":"quantity","value":"30"}
]

3 个答案:

答案 0 :(得分:2)

FormData构造函数 - 在传递对表单节点的引用时 - 返回包含所有表单控件及其各自值的迭代器。

complex_expr_path
   : complex_expr_path '::' ident
   | ident '::' ident

expr_path: ident | complex_expr_path

问题是const form = document.querySelector("#form"); const data = new FormData(form); console.log(Array.from(data)); // [["id","1"],["quantity","10"],["id","2"],["quantity","20"],["id","3"],["quantity","30"]] 无法对表单控件进行分组。这将需要算法,而算法又需要某种方法来识别给定控件属于哪个组。

这里我给每个表单控件的name属性添加了一个组标识符和冒号。在算法中,我使用冒号分割name属性,使用第一个结果作为组,第二个结果作为键。

FormData
const form = document.querySelector("#form");
const data = new FormData(form);

const grouped = Array.from(data).reduce((m, e) => 
  ((([g, k, v] = [...e[0].split(':'), e[1]]) =>  
    (m[g] = Object.assign({}, m[g]))[k] = v)(), m), {});

console.log(grouped);

答案 1 :(得分:-1)

var arr = []

$($('form').prop('elements')).each(function(e){
 arr.push({
  "id": e,
  "qty": this.value
 });
});
console.log(arr);

试试这个。

答案 2 :(得分:-1)

你可以这样做:

(function($){
  $(function(){
    $("#RunCode").click(function(e){
      var FormData = [];
      $("#form input.serialize").each(function(){
        var name = $(this).attr("name");
        name = name.split("[")
        var id = name[1].replace("]", "");
        name = name[0];
        if(typeof FormData[id] == "undefined"){ FormData[id] = {}; }
        FormData[id][name] = $(this).val();
        console.log(name, id, $(this).val(), FormData);
      });
      var str = JSON.stringify(FormData);
      alert(str);
      
      e.preventDefault();
      return false;
    });
  });
})(jQuery);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<form id="form">
    <div>
    <input class="serialize" type="hidden" name="id[0]" value="1">
    <input class="serialize" name="quantity[0]" min="0" type="text" value="10" />
    </div>
    <div>
    <input class="serialize" type="hidden" name="id[1]" value="2">
    <input class="serialize" name="quantity[1]" min="0" type="text" value="20" />
    </div>
    <div>
    <input class="serialize" type="hidden" name="id[2]" value="3">
    <input class="serialize" name="quantity[2]" min="0" type="text" value="30" />
    </div>
    <input type="button" id="RunCode" value="Run Code" />
</form>