JavaScript中按作物类型汇总面积并排序生成名称数组
解决方案
先假设你的两个数组结构如下(如果和实际结构有出入,调整对应属性名即可):
// typeCrop 示例:每个对象包含作物ID和名称 const typeCrop = [ { id: 1, cropName: 'apple' }, { id: 2, cropName: 'berry' }, { id: 3, cropName: 'orange' }, { id: 4, cropName: 'pineapple' } ]; // lands 示例:每个对象包含地块类型ID和面积 const lands = [ { landTypeID: 1, area: 60 }, { landTypeID: 1, area: 40 }, { landTypeID: 2, area: 80 }, { landTypeID: 3, area: 70 }, { landTypeID: 4, area: 50 } ];
实现步骤:
- 汇总面积:用
reduce遍历lands数组,按landTypeID累加面积
const areaSummary = lands.reduce((acc, land) => { const id = land.landTypeID; // 已存在的ID累加面积,不存在则初始化为当前面积 acc[id] = (acc[id] || 0) + land.area; return acc; }, {}); // 此时areaSummary为:{1: 100, 2: 80, 3:70, 4:50}
- 按面积降序排序:把汇总对象转成包含ID和面积的数组,再排序
const sortedEntries = Object.entries(areaSummary) .map(([id, area]) => ({ id: Number(id), area })) // 将字符串ID转为数字(匹配typeCrop的ID类型) .sort((a, b) => b.area - a.area); // 此时sortedEntries为:[{id:1, area:100}, {id:2, area:80}, ...]
- 匹配作物名称生成结果数组:遍历排序后的数组,从
typeCrop中提取对应名称
// 把typeCrop转成Map,提升大数组的查找效率 const cropMap = new Map(typeCrop.map(crop => [crop.id, crop.cropName])); const result = sortedEntries.map(item => cropMap.get(item.id)); // 最终result就是:['apple','berry','orange','pineapple']
完整整合代码:
const typeCrop = [ { id: 1, cropName: 'apple' }, { id: 2, cropName: 'berry' }, { id: 3, cropName: 'orange' }, { id: 4, cropName: 'pineapple' } ]; const lands = [ { landTypeID: 1, area: 60 }, { landTypeID: 1, area: 40 }, { landTypeID: 2, area: 80 }, { landTypeID: 3, area: 70 }, { landTypeID: 4, area: 50 } ]; // 汇总面积 const areaSummary = lands.reduce((acc, land) => { const id = land.landTypeID; acc[id] = (acc[id] || 0) + land.area; return acc; }, {}); // 排序 const sortedEntries = Object.entries(areaSummary) .map(([id, area]) => ({ id: Number(id), area })) .sort((a, b) => b.area - a.area); // 匹配名称 const cropMap = new Map(typeCrop.map(crop => [crop.id, crop.cropName])); const result = sortedEntries.map(item => cropMap.get(item.id)); console.log(result); // 输出:['apple','berry','orange','pineapple']
如果你的数组属性名和示例不同(比如typeCrop里的名称是name而非cropName,lands里的面积是size),修改对应属性名即可。
内容的提问来源于stack exchange,提问作者Almurik
相关产品推荐
相关产品推荐

