TypeScript实现对象数组多级分组:按object_id、assembly_id等分组
多层嵌套分组实现方案
你的问题核心是原transformArray仅支持单字段扁平分组,无法直接实现多层嵌套分组。下面提供两种可行的实现方式:
方案一:基于原函数的链式嵌套调用
如果希望保留原函数,可通过逐层调用的方式实现嵌套分组,每一层的分组结果作为下一层的输入:
// 原分组函数保留 transformArray(array: Array<any>, field: string) { if (!array) return []; const groupedObj = array.reduce((prev, cur) => { const key = String(cur[field]); // 统一转为字符串key,避免类型不一致问题 if (!prev[key]) { prev[key] = [cur]; } else { prev[key].push(cur); } return prev; }, {}); return Object.keys(groupedObj).map(key => ({ key, value: groupedObj[key] })); } // 实现多层分组 const originalArray = [/* 你的对象数组 */]; // 按 object_id → assembly_id → item_id → interval 依次分组 const finalGroups = transformArray(originalArray, 'object_id').map(objectGroup => ({ key: objectGroup.key, value: transformArray(objectGroup.value, 'assembly_id').map(assemblyGroup => ({ key: assemblyGroup.key, value: transformArray(assemblyGroup.value, 'item_id').map(itemGroup => ({ key: itemGroup.key, value: transformArray(itemGroup.value, 'interval') })) })) }));
方案二:通用多层嵌套分组函数
更高效的方式是封装一个支持多字段递归分组的通用函数,一次性完成所有层级的分组:
// 定义嵌套分组的类型(可选,增强TypeScript类型安全) type NestedGroup<T> = { key: string; value: T[] | NestedGroup<T>[]; }; function groupByNested<T>(array: T[], fields: Array<keyof T>): NestedGroup<T>[] { // 边界处理:空数组或无分组字段时返回空 if (!array.length || !fields.length) return []; // 取出当前要分组的字段,剩余字段用于递归 const [currentField, ...remainingFields] = fields; // 按当前字段分组 const grouped = array.reduce((prev, cur) => { const key = String(cur[currentField]); if (!prev[key]) prev[key] = []; prev[key].push(cur); return prev; }, {} as Record<string, T[]>); // 递归处理剩余字段,生成嵌套结构 return Object.entries(grouped).map(([key, value]) => ({ key, value: remainingFields.length ? groupByNested(value, remainingFields) : value })); } // 使用方式:直接传入分组字段顺序 const finalGroups = groupByNested(originalArray, ['object_id', 'assembly_id', 'item_id', 'interval']);
方案优势
- 通用函数支持任意数量的嵌套分组,修改字段顺序或新增分组维度只需调整传入的字段数组
- 类型约束确保分组字段为对象的合法属性,避免拼写错误
- 返回结构与原
transformArray兼容,便于后续展示逻辑复用
内容的提问来源于stack exchange,提问作者Alif Dev
相关产品推荐
相关产品推荐

