JavaScript如何按规则提取值为数组的对象中的元素拼接数组
按固定规则轮询提取多数组元素拼接结果
需求规则
- 遍历输入对象的所有键,每一轮遍历过程中,从每个键对应的数组里,取出前2个还没被提取过的元素
- 重复执行多轮遍历,直到所有数组里的元素全部被提取完毕,最终把所有取出的元素按提取顺序拼成一个数组返回
可直接运行的实现代码
function extractAndConcat(sourceObj) { const result = []; // 整理所有待处理数组,给每个数组记录当前读取到的位置 const arrayQueue = Object.keys(sourceObj).map(key => ({ data: sourceObj[key], cursor: 0 })); while (true) { let hasUnread = false; for (const item of arrayQueue) { // 每次最多取2个元素 const picked = item.data.slice(item.cursor, item.cursor + 2); if (picked.length) { hasUnread = true; result.push(...picked); item.cursor += 2; } } // 本轮没取到任何内容,说明全部读完了 if (!hasUnread) break; } return result; } // 测试输入 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 } ] }; // 执行后输出和预期结果完全一致 console.log(extractAndConcat(object));
实现说明
- 代码不会修改原始输入的对象和内部数组,无副作用
- 自动兼容不同长度的数组:如果某个数组剩余元素不足2个、或者已经被读完,会自动取剩余所有元素/直接跳过,不会抛出异常
- 键的遍历顺序遵循
Object.keys()的默认遍历规则,和示例中a→b→c的提取顺序完全匹配,输出结果和预期一致
内容的提问来源于stack exchange,提问作者Gin tama
相关产品推荐
相关产品推荐

