Javascript 从表单获取JSON

Javascript 从表单获取JSON,javascript,jquery,json,forms,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)

我正在使用下面的函数将表单代码转换为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"}
如果它们具有相同的名称,则表示所有表单字段的
地址
:它将它们组合为:

Object {address: Array[3]} address: Array[3] 0: "dfddf" 1: "dfdfdf" 2: "fewwewe"length: 3
哪个是正确的

我试图得到以下结果:

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

如何进行此更改

看起来您只是在扩展对象,而不是创建所需的数组。 无论您想要的是类似JSON的对象还是数组,如果希望将每个对象作为单独的对象,您仍然需要一个对应于每个对象的键。因此,不是:

  o[this.name]=this.value
你需要

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

或:


这样你就可以随心所欲地在
o
中分离对象。

我睡眠不足,所以有更好的方法来实现这一点,但如果我理解的话,这似乎可以满足你的需要。这将使每个数组成为一个OBJ数组,其形式为
{“objkey”:valAtIndex}
。因此在本例中,
对象{address:Array[3]}address:Array[3]0:“dfddf”1:“dfdfdf”2:“fewwewe”长度:3
将变为:

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

编辑:要访问它们,请如上所述使用
t[“地址”]
。运行代码后查看控制台,您会看到:

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

编辑:删除了令人困惑的“结果”部分。

那么您想删除输入名称末尾的数字吗?您的函数总是返回一个对象,您试图获取的结果看起来像一个数组。如果您想以不同的方式处理具有公共名称的对象,我首先使用getElementsByName()或等效库分别选择它们如果你想在一个循环中处理所有的元素,或者分别处理它们。那么我应该怎么做,如果需要通过循环,请引导好,如果在一个循环中。如果this.name==“address”,则执行一个运行的条件。在该循环中,只需执行o.push({this.name:this.value})——这将在数组中为您提供一组对象,每个对象都包含一个具有相同“address”键的元素,如上所示。你会做你在else上面(或多或少)做的事。等一下,我会纠正我对她说的话,然后发布一个真实的答案。抱歉,只是有点像你的代码。user1167442(很好的名字,非常独特。字面上)有一个很好的观点,如下。你能重写这个函数吗,它变得混乱了,我在更改时迷路了……我不能完全理解你要做什么,我没有时间去理解它,但是1。我认为你让这件事变得更难了。如果需要对象数组或对象伪数组对象,则需要将对象添加到父对象,而不是向父对象添加键。如果向父对象添加键,则将使用新值扩展父对象,而不是使用新对象扩展父对象。令人敬畏的是,有一个问题:它给我的结果是
{“address”:[{“address”:“Halifax,NS,Canada”},{“address”:“Toronto,ON,Canada”},{“address”:“Winnipeg,MB,Canada”}根据你的代码,它应该是完美的。我正在检查它:
{“address”:[{“address”:“Halifax,NS,Canada”},{“address”:“Toronto,ON,Canada”},{“address”:“Winnipeg,MB,Canada”}}
注意,
es
在开始区分它的时候是一个有趣的想法,当然可以我不相信授予用例是那么实用。就个人而言,我只需要使用
t[“address”]
来访问“address”objs。那么你是否对我修复这个问题的方式做了任何更改这就是你访问数组中对象的方式:t[“address”]=
[{“address”:“Halifax,NS,Canada”},{“address”:“多伦多,ON,Canada”},{“address”:“Winnipeg,MB,Canada”}
{"address":[
  {"address": "dfddf"}, 
  {"address": "dfdfdf"}, 
  {"address": "fewwewe"}
]}
<form action="" id="form">
  <input type="text" name='address' value='123' />
  <input type="text" name='address' value='456' />
</form>
$.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));
});
[
    { "address": "123" },
    { "address": "456" }
]