使用JavaScript合并SQL查询结果数组中重复元素的实现方法
方案1:JS层结果聚合(最推荐,灵活度最高)
不需要调整现有SQL查询逻辑,拿到原生查询返回的结果后直接做遍历分组即可,兼容性最强,适配所有数据库场景:
const { QueryTypes } = require('sequelize'); // 你的现有原生查询逻辑 const rawResult = await sequelize.query('你当前使用的SQL查询语句', { type: QueryTypes.SELECT }); // 按legnumber分组聚合 const legMap = new Map(); rawResult.forEach(item => { if (!legMap.has(item.legnumber)) { legMap.set(item.legnumber, { legnumber: item.legnumber, classes: [] }); } legMap.get(item.legnumber).classes.push({ classcode: item.classcode }); }); // 生成最终格式 const finalResult = { legs: Array.from(legMap.values()) };
如果项目中已经引入了lodash,可以用更简洁的写法:
const _ = require('lodash'); const grouped = _.groupBy(rawResult, 'legnumber'); const finalResult = { legs: Object.entries(grouped).map(([legnumber, items]) => ({ legnumber: Number(legnumber), classes: items.map(i => ({ classcode: i.classcode })) })) };
方案2:SQL层面直接聚合(适合大数据量场景)
如果你的数据库支持JSON聚合函数(MySQL5.7+、PostgreSQL等主流数据库都支持),可以直接在查询阶段就生成聚合结构,减少JS层计算开销:
MySQL示例SQL
SELECT legnumber, JSON_ARRAYAGG(JSON_OBJECT('classcode', classcode)) AS classes FROM -- 你原来的表、JOIN关联、WHERE条件都保留不变 GROUP BY legnumber
PostgreSQL示例SQL
SELECT legnumber, json_agg(json_build_object('classcode', classcode)) AS classes FROM -- 你原来的表、JOIN关联、WHERE条件都保留不变 GROUP BY legnumber
执行上述SQL拿到结果后,直接包一层{ legs: 查询结果 }就是你需要的最终格式。
内容的提问来源于stack exchange,提问作者Nico68
相关产品推荐
相关产品推荐

