如何在JavaScript中按作物类型统计总面积并关联名称
如何在JavaScript中根据作物ID关联数组并汇总总面积?
需求说明
需要将paddocks数组按paddockTypeId分组汇总总面积,再关联paddockType数组中的作物名称,最终得到包含作物名称和对应总面积的数组。
实现步骤与代码
步骤1:建立作物ID与名称的映射表
先把paddockType转换成以ID为键、名称为值的Map,这样可以快速通过ID查找作物名称,避免重复遍历数组(类似Java中的HashMap):
const typeMap = new Map(); paddockType.forEach(type => { typeMap.set(type.id, type.name); });
步骤2:汇总每个作物ID的总面积
遍历paddocks数组,用Map记录每个作物ID的累计面积:
const areaSumMap = new Map(); paddocks.forEach(paddock => { const cropId = paddock.paddockTypeId; const currentArea = paddock.area; // 若已存在该ID则累加面积,否则初始化 areaSumMap.set(cropId, (areaSumMap.get(cropId) || 0) + currentArea); });
步骤3:转换为目标格式数组
将汇总好的面积Map,结合作物名称映射表,转换成最终需要的数组结构:
const finalResult = Array.from(areaSumMap.entries()).map(([id, totalArea]) => { return { name: typeMap.get(id), totalArea: totalArea }; }); // 输出结果 console.log(finalResult);
简洁版代码(合并步骤)
如果熟悉JavaScript数组方法,可以用reduce简化汇总逻辑,把三步合并为:
// 建立ID-名称映射 const typeMap = new Map(paddockType.map(type => [type.id, type.name])); // 汇总面积并转换格式 const finalResult = Array.from( paddocks.reduce((sumMap, paddock) => { const id = paddock.paddockTypeId; sumMap.set(id, (sumMap.get(id) || 0) + paddock.area); return sumMap; }, new Map()) ).map(([id, total]) => ({ name: typeMap.get(id), totalArea: total })); console.log(finalResult);
结果示例
最终输出的数组结构如下(数值为实际汇总结果):
[ { name: 'PALTOS', totalArea: 56259 }, { name: 'NOGALES', totalArea: 2151 }, { name: 'AVELLANOS', totalArea: 87008 }, { name: 'CEREZAS', totalArea: 38073 } ]
内容的提问来源于stack exchange,提问作者 anon
相关产品推荐
相关产品推荐

