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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:54:03