JavaScript如何将按方位分组的时间值数组转为按时间分组的结构
实现思路
- 先初始化空对象作为时间戳映射表,key为时间字符串,value为预设了四个方位默认值为null的对象
- 遍历原数组的每一个方位项,拿到方位标识(n/e/s/w)和对应的数值列表
- 遍历该方位的所有数值项,对应更新映射表中对应时间的方位值
- 最后把映射表的所有值提取为数组,按时间排序即可
完整代码实现
function transformData(rawData) { // 预设四个方位默认值 const defaultFaces = { n: null, e: null, s: null, w: null }; const timeMap = {}; // 遍历原始数据填充映射表 rawData.forEach(faceItem => { const face = faceItem.face; faceItem.values.forEach(valItem => { const time = valItem.time; // 首次遇到该时间则初始化默认结构 if (!timeMap[time]) { timeMap[time] = { time, ...defaultFaces }; } // 赋值对应方位的数值 timeMap[time][face] = valItem.value; }); }); // 提取为数组并按时间升序排序 return Object.values(timeMap).sort((a, b) => a.time.localeCompare(b.time)); } // 测试调用 const raw = [ { face:"n", values:[ {time:"15:00",value:5}, {time:"15:02",value:6} ] },{ face:"e", values:[ {time:"15:01",value:7}, {time:"15:02",value:8} ] },{ face:"s", values:[ {time:"15:01",value:7}, {time:"15:02",value:8} ] },{ face:"w", values:[ {time:"15:01",value:7}, {time:"15:02",value:8} ] } ]; console.log(transformData(raw));
逻辑说明
- 用映射表存储时间维度的数据,避免重复创建同时间的对象,自动处理缺省值
- 最后加排序步骤保证输出数组是按时间正序排列,适配原始数据时间乱序的场景
- 方位固定为四个,默认值统一设为null,完全符合转换要求
内容的提问来源于stack exchange,提问作者justadev
相关产品推荐
相关产品推荐

