如何用JavaScript从JSON数据库提取各省份累计病例最大值
如何用JavaScript从加拿大省份疾病通报数据中获取各省份累计病例最大值?
问题描述
我有一个存储加拿大省份疾病通报累计数据的JSON数据集,每条数据包含Province(省份)、Number of cases(新增病例数)、Cumulative number(累计病例数)字段,示例数据如下:
const diseaseData = [ { Province: "Quebec", "Number of cases": 1, "Cumulative number": 1 }, { Province: "Ontario", "Number of cases": 2, "Cumulative number": 2 }, { Province: "Quebec", "Number of cases": 1, "Cumulative number": 2 }, { Province: "Quebec", "Number of cases": 1, "Cumulative number": 3 }, { Province: "BC", "Number of cases": 4, "Cumulative number": 4 }, { Province: "BC", "Number of cases": 1, "Cumulative number": 5 } ];
我需要得到每个省份的累计病例最大值,期望输出结果为:
Quebec 3 Ontario 2 BC 5
我编码经验较少,想请教如何用JavaScript实现该需求,同时不确定以下三种方式哪种更合适:
- 累加新增病例数;
- 提取各省份累计病例的最大值;
- 选取各省份最后一条数据记录。
三种方式的适用性分析
- 方式1:累加新增病例数:仅适合需要验证
累计病例数字段准确性的场景,如果数据集本身的累计值是可靠的,这种方式属于冗余计算,没必要使用。 - 方式2:提取各省份累计病例的最大值:这是最直接匹配需求的方式,不管数据排序如何,只要遍历所有记录就能准确拿到每个省份的累计最大值,适用性最强。
- 方式3:选取各省份最后一条数据记录:仅当数据严格按时间顺序排列(最新记录在最后),且最后一条记录的累计值就是最大值时有效,数据顺序混乱的话结果会出错。
JavaScript实现代码
推荐:方式2(提取累计最大值)
使用reduce方法遍历数据,维护一个存储各省份最大累计值的对象:
const diseaseData = [ { Province: "Quebec", "Number of cases": 1, "Cumulative number": 1 }, { Province: "Ontario", "Number of cases": 2, "Cumulative number": 2 }, { Province: "Quebec", "Number of cases": 1, "Cumulative number": 2 }, { Province: "Quebec", "Number of cases": 1, "Cumulative number": 3 }, { Province: "BC", "Number of cases": 4, "Cumulative number": 4 }, { Province: "BC", "Number of cases": 1, "Cumulative number": 5 } ]; // 计算各省份累计病例最大值 const maxCumulativeByProvince = diseaseData.reduce((acc, current) => { const province = current.Province; const currentCumulative = current["Cumulative number"]; // 若省份未记录,或当前累计值大于已存最大值则更新 if (!acc[province] || currentCumulative > acc[province]) { acc[province] = currentCumulative; } return acc; }, {}); // 格式化输出结果 for (const [province, maxCumulative] of Object.entries(maxCumulativeByProvince)) { console.log(`${province.padEnd(12)} ${maxCumulative}`); }
运行后输出:
Quebec 3 Ontario 2 BC 5
可选:方式3(数据有序时取最后一条)
如果数据是按时间顺序排列的,可直接覆盖省份的累计值,最后一次赋值即为最新累计值:
const latestCumulativeByProvince = diseaseData.reduce((acc, current) => { acc[current.Province] = current["Cumulative number"]; return acc; }, {}); // 输出结果 for (const [province, cumulative] of Object.entries(latestCumulativeByProvince)) { console.log(`${province.padEnd(12)} ${cumulative}`); }
可选:方式1(累加新增病例验证)
若需要通过新增病例数计算累计值,可使用以下代码:
const cumulativeSumByProvince = diseaseData.reduce((acc, current) => { const province = current.Province; const newCases = current["Number of cases"]; // 初始化或累加新增病例数 acc[province] = (acc[province] || 0) + newCases; return acc; }, {}); // 输出结果 for (const [province, sum] of Object.entries(cumulativeSumByProvince)) { console.log(`${province.padEnd(12)} ${sum}`); }
注意:这种方式的结果和前两种一致的前提是,数据中的累计病例数与新增病例的累加结果完全匹配。
内容的提问来源于stack exchange,提问作者isabelle
相关产品推荐
相关产品推荐

