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

合并JSON对象生成统计结果时遇空槽与undefined问题求助

解决COVID学校数据合并时的Undefined与统计错误问题

嘿,我看了你的代码和数据,发现两个核心问题导致了undefined和统计错误:一是**codcentre编码格式不统一**(比如covidResults里的"8000131"和infoResults里的"08000131"差了前导0),二是数据处理逻辑的效率和结构问题。咱们一步步把它修好:

问题拆解

  1. 匹配失败:部分学校的codcentre编码长度不一致,直接导致匹配不上,concatResults缺失数据
  2. 空槽问题:你用数组newObjectResults存储区域数据,但数组索引是codeRegion(比如"02"、"10"),这会导致索引从0到21之间的空位置,最终出现undefined
  3. 统计错误:totalCovidRegion用了全局变量,导致统计的是所有区域的累计值,而不是每个区域单独的数量

修复后的完整代码

const covidResults = [ { datageneracio: "2020-09-23T00:00:00.000", codcentre: "17010402", estat: "Obert", grup_confin: "0", alumn_confin: "0", docent_confin: "0", altres_confin: "0" }, { datageneracio: "2020-09-23T00:00:00.000", codcentre: "17010384", estat: "Obert", grup_confin: "0", alumn_confin: "0", docent_confin: "0", altres_confin: "0" }, { datageneracio: "2020-09-23T00:00:00.000", codcentre: "17008948", estat: "Confinat", grup_confin: "0", alumn_confin: "0", docent_confin: "0", altres_confin: "0" }, { datageneracio: "2020-09-23T00:00:00.000", codcentre: "17008900", estat: "Obert", grup_confin: "0", alumn_confin: "0", docent_confin: "0", altres_confin: "0" }, { datageneracio: "2020-09-23T00:00:00.000", codcentre: "8000131", estat: "Confinat", grup_confin: "0", alumn_confin: "0", docent_confin: "0", altres_confin: "0" }, { datageneracio: "2020-09-23T00:00:00.000", codcentre: "8000153", estat: "Obert", grup_confin: "0", alumn_confin: "0", docent_confin: "0", altres_confin: "0" }, { datageneracio: "2020-09-23T00:00:00.000", codcentre: "8000165", estat: "Confinat", grup_confin: "0", alumn_confin: "0", docent_confin: "0", altres_confin: "0" } ];
const infoResults = [ { codcentre: "17010402", name: "Llar d'infants Municipal La Bòbila", address: "av. de Can Caramany, s/n", codi_postal: "17121", regionName: "Baix Empordà", codeRegion: "10", city: "Corçà", long: "3.014146876", lat: "41.98864073" }, { codcentre: "17010384", name: "L'Energia-C.aut.ens.art.pro.de Música Palafrugell", address: "Pi i Margall,114/Manufactur.Suro,51-67", codi_postal: "17200", regionName: "Baix Empordà", codeRegion: "10", city: "Palafrugell", long: "3.164713218", lat: "41.921198948" }, { codcentre: "17008948", name: "Llar d'infants Els Nins", address: "pl. Onze de Setembre, 1", codi_postal: "17493", regionName: "Alt Empordà", codeRegion: "02", city: "Vilajuïga", long: "3.094177279", lat: "42.327433814" }, { codcentre: "17008900", name: "Llar d'infants de Cabanes", address: "c. Colon, 8", codi_postal: "17761", regionName: "Alt Empordà", codeRegion: "02", city: "Cabanes", long: "2.977203057", lat: "42.30876845" }, { codcentre: "08000131", name: "La Presentació", address: "c. Pompeu Fabra, 2", codi_postal: "08350", regionName: "Maresme", codeRegion: "21", city: "Arenys de Mar", long: "2.547075835", lat: "41.585754015" }, { codcentre: "08000153", name: "Escola Joan Maragall", address: "c. Riera Sa Clavella, s/n", codi_postal: "08350", regionName: "Maresme", codeRegion: "21", city: "Arenys de Mar", long: "2.54631495", lat: "41.582404768" }, { codcentre: "08000165", name: "Escola Sant Martí", address: "c. Generalitat, 2", codi_postal: "08358", regionName: "Maresme", codeRegion: "21", city: "Arenys de Munt", long: "2.53853995", lat: "41.609034581" } ];

// 标准化codcentre:统一转成8位字符串,补前导0
const normalizeCodcentre = (code) => code.padStart(8, '0');

// 把infoResults转成以标准化codcentre为键的对象,提升匹配效率
const infoMap = infoResults.reduce((map, school) => {
  const normalizedCode = normalizeCodcentre(school.codcentre);
  map[normalizedCode] = school;
  return map;
}, {});

// 合并两个数据集,只保留匹配成功的项
const concatResults = covidResults.map(covidItem => {
  const normalizedCode = normalizeCodcentre(covidItem.codcentre);
  const schoolInfo = infoMap[normalizedCode];
  if (schoolInfo) {
    return {
      estat: covidItem.estat,
      codcentre: normalizedCode,
      regionName: schoolInfo.regionName,
      codeRegion: schoolInfo.codeRegion,
      name: schoolInfo.name
    };
  }
  // 过滤掉匹配失败的项
  return null;
}).filter(item => item !== null);

// 按区域统计数据:用普通对象存储,避免数组空槽
const regionStats = concatResults.reduce((stats, item) => {
  const { codeRegion, regionName, estat } = item;
  if (!stats[codeRegion]) {
    stats[codeRegion] = {
      codeRegion,
      regionName,
      totalSchoolsByRegion: 0,
      totalCovidRegion: 0
    };
  }
  stats[codeRegion].totalSchoolsByRegion += 1;
  if (estat === 'Confinat') {
    stats[codeRegion].totalCovidRegion += 1;
  }
  return stats;
}, {});

// 转成最终需要的数组格式
const finalResults = Object.values(regionStats);

console.log("finalResults", finalResults);

关键改动说明

  1. 标准化编码:用padStart(8, '0')把所有codcentre统一成8位字符串,解决了编码格式不一致导致的匹配失败问题
  2. 高效匹配:用reduce把infoResults转成映射对象,匹配时间复杂度从O(n²)降到O(n),性能更好
  3. 避免空槽:用普通对象regionStats存储区域统计数据,之后用Object.values()转成数组,彻底解决空槽和undefined问题
  4. 正确统计:在reduce里直接统计每个区域的学校总数和隔离数,不用全局变量,确保每个区域的统计值独立准确

最终输出结果

运行后finalResults会得到正确的统计数据:

[
  { codeRegion: '10', regionName: 'Baix Empordà', totalSchoolsByRegion: 2, totalCovidRegion: 0 },
  { codeRegion: '02', regionName: 'Alt Empordà', totalSchoolsByRegion: 2, totalCovidRegion: 1 },
  { codeRegion: '21', regionName: 'Maresme', totalSchoolsByRegion: 3, totalCovidRegion: 2 }
]

内容的提问来源于stack exchange,提问作者ccnat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 19:38:13