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

如何按group_id分组对象数组?MySQL或JavaScript实现方案

按group_id分组生成嵌套对象数组的实现方案

MySQL实现方式

MySQL 8.0及以上版本支持JSON函数,可以通过分组聚合生成目标结构,但需要依赖具体的数据标识字段(比如区分两个数组的type字段)。

假设原表为data_table,包含group_id, id, name, type字段,示例查询如下:

SELECT 
  group_id,
  -- 生成第一个对象数组并过滤null值
  JSON_REMOVE(
    JSON_ARRAYAGG(CASE WHEN type = 'type1' THEN JSON_OBJECT('id', id, 'name', name) END),
    '$[*]null'
  ) AS array1,
  -- 生成第二个对象数组并过滤null值
  JSON_REMOVE(
    JSON_ARRAYAGG(CASE WHEN type = 'type2' THEN JSON_OBJECT('id', id, 'name', name) END),
    '$[*]null'
  ) AS array2
FROM data_table
GROUP BY group_id;

注意:这种方式存在局限性,比如聚合函数有长度限制(可通过参数调整),且嵌套结构复杂时维护成本高。若group_id或数组区分条件需要动态变化,前端JavaScript处理会更灵活。

JavaScript实现方式(支持动态group_id)

如果MySQL方案无法满足动态需求,推荐用JavaScript处理,以下是两种通用实现:

基础版(基于固定字段区分数组)

function groupIntoNestedArrays(arr, groupKey, typeField, type1Value, type2Value) {
  const groupedMap = {};

  arr.forEach(item => {
    const groupId = item[groupKey];
    // 初始化分组结构
    if (!groupedMap[groupId]) {
      groupedMap[groupId] = {
        [groupKey]: groupId,
        array1: [],
        array2: []
      };
    }
    // 根据指定字段判断加入对应数组
    const targetArray = item[typeField] === type1Value ? 'array1' : 'array2';
    groupedMap[groupId][targetArray].push({ ...item });
  });

  return Object.values(groupedMap);
}

// 示例使用
const originalData = [
  { group_id: 1, id: 1, name: '张三', type: 'student' },
  { group_id: 1, id: 2, name: '李老师', type: 'teacher' },
  { group_id: 2, id: 3, name: '王五', type: 'student' },
  { group_id: 2, id: 4, name: '赵老师', type: 'teacher' }
];

// 按group_id分组,student进array1,teacher进array2
const result = groupIntoNestedArrays(originalData, 'group_id', 'type', 'student', 'teacher');
console.log(result);

高级版(支持自定义区分逻辑)

如果需要更灵活的数组区分规则,可以传入判断函数:

function dynamicGroup(arr, groupKey, filterArray1, filterArray2) {
  const groupedMap = {};

  arr.forEach(item => {
    const groupId = item[groupKey];
    if (!groupedMap[groupId]) {
      groupedMap[groupId] = {
        [groupKey]: groupId,
        array1: [],
        array2: []
      };
    }

    if (filterArray1(item)) {
      groupedMap[groupId].array1.push({ ...item });
    } else if (filterArray2(item)) {
      groupedMap[groupId].array2.push({ ...item });
    }
  });

  return Object.values(groupedMap);
}

// 示例使用:按id奇偶区分数组,group_id动态指定为'class_id'
const customResult = dynamicGroup(
  originalData.map(item => ({ ...item, class_id: item.group_id })),
  'class_id',
  item => item.id % 2 === 1, // id奇数进array1
  item => item.id % 2 === 0  // id偶数进array2
);
console.log(customResult);

这种方式完全支持group_id动态变化,只需传入对应的键名即可,区分逻辑也可根据业务需求自定义。

内容的提问来源于stack exchange,提问作者Monmon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 22:03:26