如何轮询遍历对象内数组每次取2个元素直至末尾生成目标数组
按轮次批量提取数组成员的合并实现
需求规则
- 输入为属性值均是数组的对象,最终返回全新的合并结果数组,不修改原对象和原数组
- 遍历逻辑:按对象自身键的遍历顺序,每一轮依次从每个键对应的数组中,提取2个尚未处理的元素加入结果数组
- 单轮走完所有键的遍历后,重复上述批量提取操作,直到所有数组的元素全部处理完成
示例输入
const object = { a: [ { name: "John", age: 32 }, { name: "David", age: 23 }, { name: "Justin", age: 28 }, { name: "Arnauld", age: 35 } ], b: [ { name: "Ivan", age: 18 }, { name: "Nekko", age: 13 }, { name: "Lena", age: 25 } ], c: [ { name: "Ann", age: 19 }, { name: "Nick", age: 14 } ] };
期望输出
[ { name: "John", age: 32 }, { name: "David", age: 23 }, { name: "Ivan", age: 18 }, { name: "Nekko", age: 13 }, { name: "Ann", age: 19 }, { name: "Nick", age: 14 }, { name: "Justin", age: 28 }, { name: "Arnauld", age: 35 }, { name: "Lena", age: 25 } ]
实现代码
function batchMerge(sourceObj, step = 2) { const merged = []; const allArrays = Object.values(sourceObj); let offset = 0; while (true) { let hasRemaining = false; for (const list of allArrays) { const currentBatch = list.slice(offset, offset + step); if (currentBatch.length) { hasRemaining = true; merged.push(...currentBatch); } } if (!hasRemaining) break; offset += step; } return merged; } // 调用测试 const result = batchMerge(object);
代码逻辑说明:
- 用
offset记录每轮截取的起始位置,初始为0 - 每轮遍历所有数组,从
offset位置开始截取长度为2的片段,有内容就追加到结果里,同时标记还有未处理元素 - 如果某一轮遍历完所有数组都没取到元素,说明所有元素处理完毕,直接返回结果
内容的提问来源于stack exchange,提问作者AdSad4017
相关产品推荐
相关产品推荐

