如何在AJAX的success回调函数中正确使用for循环遍历数组?
解决AJAX返回数组后循环遍历异常的问题
看起来你遇到的核心问题是AJAX返回的JSON数据没有被正确解析为JavaScript数组,导致你用for循环的时候其实是在遍历字符串的每个字符,所以才会出现“值被逐个拆分”的情况。下面一步步帮你解决:
问题根源
你的AJAX配置里写的是datatype: 'json',但jQuery的AJAX参数是大小写敏感的,正确的参数名应该是dataType(首字母大写)。因为参数名写错了,jQuery没有自动把后端返回的JSON字符串解析成数组/对象,所以data其实是一个字符串——当你用arr.length的时候,取的是字符串的长度,循环时arr[i]就是字符串的第i个字符,自然会出现“值被拆分”的现象。
另外,document.write在页面加载完成后使用会直接覆盖整个页面,这显然不是你想要的展示效果,建议换成DOM追加的方式来渲染内容。
修正后的代码
$('#TDate').on('input change', function() { var name = $('#TDate').val(); var credit = 0; var debit = 0; $.ajax({ type: "POST", url: "<?php echo base_url();?>BookKeeping/item", data: {name: name}, dataType: 'json', // 修正参数名的大小写问题 success: function (data) { // 先确保数据是数组格式,避免后端返回异常数据 if (!Array.isArray(data)) { // 若后端返回的仍是字符串,手动解析JSON try { data = JSON.parse(data); } catch(e) { alert('数据解析失败:' + e.message); return; } } // 准备一个页面容器来存放结果(比如提前在页面加<div id="result"></div>) var $resultContainer = $('#result'); $resultContainer.empty(); // 清空之前的旧内容 for (var i = 0; i < data.length; i++){ $resultContainer.append("<br><br>array index: " + i); var obj = data[i]; // 确保当前项是对象再遍历属性 if (typeof obj === 'object' && obj !== null) { for (var key in obj){ // 只遍历对象自身的属性,排除原型链上的属性 if (obj.hasOwnProperty(key)) { var value = obj[key]; $resultContainer.append("<br> - " + key + ": " + value); } } } } }, error: function(xhr, status, error) { // 增加错误处理,方便排查请求失败的原因 alert('请求失败:' + error); } }); });
额外注意事项
- 确保后端返回的是标准JSON格式,并且响应头的
Content-Type设置为application/json,这样jQuery的自动解析会更可靠。 - 永远不要在AJAX回调里用
document.write,它会直接替换整个页面内容,推荐用append/html等方法操作指定DOM元素。 - 加上
error回调函数,可以帮你快速排查AJAX请求失败的原因,比如URL错误、后端报错等。
内容的提问来源于stack exchange,提问作者Jacky
相关产品推荐
相关产品推荐

