JavaScript中限制子数组长度并拆分同时间戳对象的方法
嵌套数组拆分:每个子数组最多3个对象且保持指定顺序
需求
将嵌套数组中的每个子数组按以下规则拆分:
- 拆分后的每个子数组最多包含3个对象
- 严格保持对象的原有顺序
- 优先将末尾的不同时间戳对象与前面的同时间戳对象凑成满3个的子数组(如示例中第三个原数组的拆分逻辑)
现有数据
const results = [ [ {id: 3337, data: "data", date: '2022-08-02T12:25:00.000Z'}, {id: 3336, data: "data", date: '2022-08-02T12:24:00.000Z'}, {id: 3335, data: "data", date: '2022-08-02T12:23:00.000Z'}, {id: 3334, data: "data", date: '2022-08-02T12:22:00.000Z'} ], [ {id: 4449, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 4448, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 4447, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 4446, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 4445, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 4444, data: "data", date: '2022-07-15T12:25:00.000Z'}, ], [ {id: 1117, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 1116, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 1115, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 1114, data: "data", date: '2022-07-15T12:25:00.000Z'}, {id: 1113, data: "data", date: '2022-07-07T12:25:00.000Z'}, ] ]
解决方案
通过反向分组再恢复顺序的方式实现需求,代码如下:
function splitNestedArrays(arr) { const finalResult = []; for (const subArr of arr) { // 反转原数组,从后往前分组 const reversed = [...subArr].reverse(); const groups = []; let currentGroup = []; for (const item of reversed) { if (currentGroup.length < 3) { currentGroup.push(item); } else { // 反转当前组恢复元素顺序,加入分组列表 groups.push(currentGroup.reverse()); currentGroup = [item]; } } // 处理最后一个未填满的分组 if (currentGroup.length > 0) { groups.push(currentGroup.reverse()); } // 反转分组列表,恢复原数组的整体顺序 finalResult.push(...groups.reverse()); } return finalResult; } // 调用示例 const splitResult = splitNestedArrays(results); console.log(splitResult);
逻辑说明
- 对每个原子数组进行反转,从末尾开始分组,确保末尾的元素优先凑成满3个的子数组
- 遍历反转后的数组,将元素加入当前分组,当分组达到3个元素时,反转分组恢复元素原有顺序并保存
- 处理完所有元素后,将分组列表反转,恢复原数组的整体顺序
- 将所有分组合并到最终结果中
内容的提问来源于stack exchange,提问作者Momo
相关产品推荐
相关产品推荐

