如何将JSON对象数组按LaneID分组并生成带Cameras的指定结构?
解决方案
你需要调整分组后的结果转换逻辑,将原函数返回的键值对对象转换为目标数组结构。以下是修改后的代码:
const groupBy = prop => data => { // 第一步:按指定属性分组,收集对应的摄像头信息 const groupedData = data.reduce((dict, item) => { // 解构出分组属性、不需要的PlazaID,剩下的就是摄像头信息 const { [prop]: groupKey, PlazaID, ...cameraInfo } = item; // 往对应分组里添加摄像头信息 dict[groupKey] = [...(dict[groupKey] || []), cameraInfo]; return dict; }, {}); // 第二步:将分组对象转换为目标数组结构 return Object.entries(groupedData).map(([key, cameras]) => ({ [prop]: Number(key), // 将字符串键转回数字类型 Cameras: cameras })); }; // 测试数据 var data = [ { PlazaID: 1, LaneID: 2, CamID: 3, CamDesc: 'Camera - 3' }, { PlazaID: 1, LaneID: 2, CamID: 4, CamDesc: 'Camera - 4' }, { PlazaID: 1, LaneID: 3, CamID: 3, CamDesc: 'Camera - 3' }, { PlazaID: 1, LaneID: 3, CamID: 4, CamDesc: 'Camera - 4' }, ]; // 调用函数 const result = groupBy('LaneID')(data); console.log(result);
代码说明
- 分组逻辑:通过
reduce遍历数组,按指定属性(这里是LaneID)分组,同时剔除不需要的PlazaID,只保留摄像头相关信息存入分组数组。 - 结构转换:使用
Object.entries将分组后的键值对对象转为数组,再通过map构造每个元素的结构——包含分组属性(如LaneID)和对应的Cameras数组。 - 类型修正:由于对象键默认是字符串,通过
Number(key)将其转回数字类型,与原数据类型保持一致。
执行后将得到你期望的输出结构:
[ { LaneID: 2, Cameras: [{ CamID: 3, CamDesc: 'Camera - 3' }, { CamID: 4, CamDesc: 'Camera - 4' }] }, { LaneID: 3, Cameras: [{ CamID: 3, CamDesc: 'Camera - 3' }, { CamID: 4, CamDesc: 'Camera - 4' }] } ]
内容的提问来源于stack exchange,提问作者SoftwareDveloper
相关产品推荐
相关产品推荐

