从表单获取JSON

时间:2014-12-27 19:37:49

标签: javascript jquery json forms

我正在使用以下函数将表单代码转换为JSON,它非常实用且非常棒

$.fn.serializeObject = function()
        {
           var o = {};
           var a = this.serializeArray();
           $.each(a, function() {
               if (o[this.name]) {
                   if (!o[this.name].push) {
                       o[this.name] = [o[this.name]];
                   }
                   o[this.name].push(this.value || '');
               } else {
                   o[this.name] = this.value || '';
               }
           });
           return o;
        };

现在它给我结果如下:[如果表单字段有不同的名称],表单字段名称为direction1,direction2,direction3

{direction1: "abc", direction2: "xyz", direction3: "def"}

如果他们有相同的名称,请说出所有表单字段中的address:它将它们组合为:

Object {address: Array[3]} address: Array[3] 0: "dfddf" 1: "dfdfdf" 2: "fewwewe"length: 3

这是正确的

我想把结果作为:

{"address": "abc"}, 
{"address": "xyz"}, 
{"address": "def"}

如何进行此更改

2 个答案:

答案 0 :(得分:2)

我被剥夺了睡眠,所以有更好的方法来做到这一点,但如果我理解的话,这似乎可以做你想要的。这将使每个数组成为{"objkey": valAtIndex }形式的obj数组。所以在这种情况下,Object {address: Array[3]} address: Array[3] 0: "dfddf" 1: "dfdfdf" 2: "fewwewe"length: 3将成为:

{"address":[
  {"address": "dfddf"}, 
  {"address": "dfdfdf"}, 
  {"address": "fewwewe"}
]}

DEMO

HTML

<form action="" id="form">
  <input type="text" name='address' value='123' />
  <input type="text" name='address' value='456' />
</form>

JS

$.fn.serializeObject = function() {
   var o = {};
   var a = this.serializeArray();
   $.each(a, function() {
       if (o[this.name]) {
           if (!o[this.name].push) {
               o[this.name] = [o[this.name]];
           }
           o[this.name].push(this.value || '');
       } else {
           o[this.name] = this.value || '';
       }
   });
   return o;
};
$(function() {
  var t = $('#form').serializeObject();
  Object.keys(t).forEach(function(key) {
    if (t[key].constructor === Array) {
      t[key].forEach(function(a, i) {
        var obj = {};
        obj[key] = a;
        t[key][i] = obj;
      });
    }
  });
  var myAddresses = t["address"];

  console.log(JSON.stringify(myAddresses, null, 4));
});

修改:要访问它们,请使用上述t["address"]。运行代码后查看控制台,您会看到:

[
    { "address": "123" },
    { "address": "456" }
]

编辑:删除令人困惑的&#34;结果&#34;部分。

答案 1 :(得分:0)

看起来你只是扩展和对象,而不是像你想要的那样创建一个数组。 无论是类似JSON的对象还是数组,如果您希望它们作为单独的对象,您仍然需要具有与每个对应对应的键。所以,而不是:

  o[this.name]=this.value

你需要

    var obj={};
    obj[this.name]=this.value;

然后:

    o.push(obj);

或者:

    o[a key of your definition]=obj;

然后,这将为您提供o内的单独对象。