【问题标题】:Multiple dimensional array[key] notation fails on jQuery ajax()jQuery ajax() 上的多维数组 [key] 表示法失败
【发布时间】:2012-01-23 00:01:30
【问题描述】:

我尝试使用 array[key] 符号来动态添加然后发送多维数组数据:

var record=[];
record['main']={};
record['sub']={};
record['main']['mainId']=$("#goto").val();
record['main']['year']=$('#year').val(); 
record['main']['month']=$('#month').val();
record['main']['date']=$('#date').val(); 
record['main']['bank_account']=$('#bank_account').val();
record['main']['voucher_type']=$('#voucher_type').val(); 
record['main']['voucher_no']=$('#voucher_no').val();
record['main']['main_subject']=$('#main_subject').val(); 
record['main']['main_summary']=$('#main_summary').val();

 $('[id^=sub_money]').each( function (index, Element) {
    record['sub'][index]=[];
    record['sub'][index]['sub_subject']=$('#sub_subject'+(index+1));
    record['sub'][index]['sub_summary']=$('#sub_summary'+(index+1));
    record['sub'][index]['sub_money']=$('#sub_money'+(index+1));
    record['sub'][index]['sub_chequeId']=$('#sub_chequeId'+(index+1));
    record['sub'][index]['sub_pyaee']=$('#sub_payee'+(index+1));
    record['sub'][index]['sub_chequeDate']=$('#sub_chequeDate'+(index+1));
});

但是.ajax() 什么也没返回:

$.ajax({
    async: false,
    dataType:'jason',
    type: 'GET',
    url: 'update_voucher.php',
    data:{'record': record},
    success: function(data) {   
        $("#message").html("Something has changed<br>"+data);
    }
});

PHP 服务器代码只是回显(一个空数组):

print_r($_GET);

JSON 编码的数组适用于像这样的静态事物:

var record = {
    foo:  123,
    bar:  456,
    rows: [
    {
        column1 : 'hello',
        column2 : 'hola',
        column3 : 'bonjour',
    },
    {
        column1 : 'goodbye',
        column2 : 'hasta luego',
        column3 : 'au revoir',
    },
    ],
    test1:{
       test2: {
          test3:  'baz'
       }
    }
};

但不适用于像这样的动态:

 var record=[]; record['sub']={};
 record['sub'][index]=[];
 record['sub'][index]['sub_subject']='abc';

在 jQuery 1.51、Firefox 7.01、Ubuntu Linux 10.04 LTS 上测试

【问题讨论】:

  • 你的意思是 JSON 吗?我不知道 jason 是什么,我认为 jQuery 也不知道。但无论如何,我无法理解您发布的代码 sn-ps。
  • dataType:'jason', 应该是 JSON。我想编辑标题以将 jason 更改为 JSON,但由于这似乎是代码中的问题之一,我将其保留原样;)

标签: javascript jquery ajax arrays json


【解决方案1】:

JavaScript 中的对象允许您存储任意属性和值。

数组是一种特殊的对象,它应该包含数字索引的顺序数据,并获得一些额外的属性,例如lengthjoin

您将数据存储在任意命名属性中,但您是在数组上进行的。当您将数组传递给 jQuery 时,它会看到它是一个数组,并假设您使用的是数字索引的顺序数据……因此它会忽略您添加的所有额外属性。

使用对象{} 而不是数组[]

【讨论】:

  • 问题出在param 方法(由jQuery.ajax 调用),它假定如果传递一个数组,它是来自序列化表单的对象数组。它只会正确序列化只有 namevalue 属性的对象数组,例如[{name:'fred',value:'foo'},{name:'bar',value:'fum']。它不会正确序列化任何其他类型的数组。
【解决方案2】:

如前所述,您将数组与对象混为一谈。有一种更简洁的方式来编写你的代码,这使得正在发生的事情变得更加明显:

var record = {
    main: {
        mainId:       $("#goto").val(),
        year:         $('#year').val(), 
        month:        $('#month').val(),
        date:         $('#date').val(),
        bank_account: $('#bank_account').val(),
        voucher_type: $('#voucher_type').val(),
        voucher_no:   $('#voucher_no').val(),
        main_subject: $('#main_subject').val(),
        main_summary: $('#main_summary').val(),
    },
    sub: []
}

$('[id^=sub_money]').each(function(i) {
    record.sub[i] = {
        sub_subject:    $('#sub_subject'    + (i+1)).val(),
        sub_summary:    $('#sub_summary'    + (i+1)).val(),
        sub_money:      $('#sub_money'      + (i+1)).val(),
        sub_chequeId:   $('#sub_chequeId'   + (i+1)).val(),
        sub_payee:      $('#sub_payee'      + (i+1)).val(),
        sub_chequeDate: $('#sub_chequeDate' + (i+1)).val()
    }
});

【讨论】:

  • 感谢您的代码,只需稍作修改,即可使用!将 main= 更改为 main: sub= 到 sub: 并将 .val() 添加到每个 $('#..'+(i+1)) 的 and
  • 如果我解决了你的问题,别忘了点击我的答案旁边的勾。
【解决方案3】:

jQuery.ajax 期望数据是对象或字符串,而不是数组。它使用param 方法对它传递的数据进行字符串化。

如果你向它传递一个数组,它会假定它是一个对象数组,表示来自序列化表单的名称/值对,并且会转:

var a = [
         {name:'fred', value:'foo'}, 
         {name:'bar',  value:'fum'}
        ];

进入字符串:

'fred=foo&bar=fum'

将一个具有任何其他结构的数组传递给它,你会得到垃圾(或什么都没有)。

您可以通过将 processData 选项设置为 false 来避免这种行为,或者通过自己将数组转换为字符串以便 jQuery 不做任何事情给它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    相关资源
    最近更新 更多