You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:22:24