如何按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
相关产品推荐
相关产品推荐

