如何处理AJAX返回的双JSON元素字符串并实现循环遍历?
解决方案:拆分JSON字符串并去除重复数字键
1. 正确拆分包含两个JSON对象的字符串
直接用split('}{')或简单正则会因为JSON内部的嵌套大括号出错,推荐用大括号计数法识别完整的JSON边界:
function splitJsonString(str) { const jsonArr = []; let startIndex = 0; let braceCount = 0; for (let i = 0; i < str.length; i++) { if (str[i] === '{') { braceCount++; } else if (str[i] === '}') { braceCount--; // 大括号计数归0时,定位到完整的JSON对象 if (braceCount === 0) { const jsonStr = str.slice(startIndex, i + 1); jsonArr.push(jsonStr); startIndex = i + 1; } } } return jsonArr; }
这个方法会跟踪大括号层级,确保只拆分独立完整的JSON对象,不会破坏内部嵌套结构。
2. 解析JSON并去除数字键重复数据
拆分后逐个解析JSON字符串,再根据需求删除数字键的重复项:
场景1:数字键与语义键值重复(自动判断)
如果数字键和语义键对应的值完全一致,用以下逻辑删除数字键:
function removeDuplicateNumberKeys(obj) { const processedObj = {...obj}; // 筛选所有非数字的语义键 const semanticKeys = Object.keys(processedObj).filter(key => isNaN(Number(key))); Object.keys(processedObj).forEach(key => { if (!isNaN(Number(key))) { // 检查当前数字键的值是否和某个语义键的值重复 const hasDuplicate = semanticKeys.some(sKey => processedObj[sKey] === processedObj[key]); if (hasDuplicate) delete processedObj[key]; } }); return processedObj; }
场景2:数字键与语义键有固定映射
如果数字键和语义键是固定对应关系(比如0对应name,1对应age),直接用映射表删除:
// 自定义数字键与语义键的映射关系 const keyMap = { '0': 'name', '1': 'age' }; function removeDuplicateNumberKeys(obj) { const processedObj = {...obj}; Object.keys(keyMap).forEach(numKey => { const semanticKey = keyMap[numKey]; // 存在语义键时删除对应的数字键 if (processedObj[semanticKey] !== undefined) { delete processedObj[numKey]; } }); return processedObj; }
3. 整合流程得到最终可用数组
把上述函数结合,处理AJAX返回的字符串:
// 示例AJAX返回的字符串 const ajaxResponse = '{"0":"Alice","name":"Alice","age":25}{"0":"Bob","name":"Bob","age":30}'; // 拆分JSON字符串 const jsonStrArr = splitJsonString(ajaxResponse); // 解析+去重,得到最终数组 const finalArr = jsonStrArr.map(jsonStr => { const obj = JSON.parse(jsonStr); return removeDuplicateNumberKeys(obj); }); // 用while循环提取数据 let index = 0; while (index < finalArr.length) { const item = finalArr[index]; console.log(`姓名:${item.name},年龄:${item.age}`); index++; }
内容的提问来源于stack exchange,提问作者nixanosize
相关产品推荐
相关产品推荐

