
本文详解如何使用取模运算(%)对数组进行轮询式分组提取,以生成如 [1,6,11,16,2,7,12,17,…] 这类按起始偏移循环采样的结果,替代错误的嵌套条件判断逻辑。
本文详解如何使用取模运算(%)对数组进行轮询式分组提取,以生成如 [1,6,11,16,2,7,12,17,…] 这类按起始偏移循环采样的结果,替代错误的嵌套条件判断逻辑。
在处理具有周期性结构的数据(如表格行/列映射、网格布局索引、分块渲染等)时,常需按固定步长、不同起始位置轮询提取数组元素。例如,给定 1–20 的连续数组,要求以步长 5 分组:第 1 组取索引 % 5 === 0 的元素(即位置 0,5,10,15 → 值 [1,6,11,16]),第 2 组取索引 % 5 === 1 的元素(位置 1,6,11,16 → [2,7,12,17]),依此类推,直至覆盖全部余数 0–4。
原代码问题在于混淆了“起始索引”与“步长”的关系,并错误地将 row + i 作为模数,导致步长动态变化;同时用 k === i 单独捕获首元素,破坏了统一的模规律。正确解法应聚焦一个核心逻辑:若当前元素索引 k 对 row 取模的结果等于当前轮次偏移 i,则该元素属于本轮输出。
以下是简洁、可扩展的实现:
const row = 5;
const cellArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20];
const newArray = [];
// 遍历所有可能的余数:0 到 row-1(共 row 组)
for (let i = 0; i < row; i++) {
cellArray.forEach((item, k) => {
if (k % row === i) {
newArray.push(item);
}
});
}
console.log(newArray);
// 输出: [1, 6, 11, 16, 2, 7, 12, 17, 3, 8, 13, 18, 4, 9, 14, 19, 5, 10, 15, 20]✅ 关键要点:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
- 外层循环 i 表示目标余数(即每组的起始偏移),范围是 [0, row-1](注意应为
- 内层 forEach 遍历整个数组,通过 k % row === i 精准匹配属于当前组的所有索引;
- 该方案时间复杂度为 O(n × row),对中等规模数组高效可靠;若需更高性能(如超大数组),可改用单次遍历 + 分组存储(例如用 Array.from({length: row}, () => []) 初始化桶数组)。
⚠️ 注意事项:
- 数组索引从 0 开始,因此 k % row === 0 对应第 1、6、11… 个元素(值为 1,6,11…),符合题目“从 1 开始编号”的语义;
- 若输入数组长度不能被 row 整除,末尾若干组元素数量会减少,但逻辑依然正确;
- 此模式天然支持任意 row 值(如 row = 3 将生成每组间隔 3 的序列),具备良好通用性。
掌握这种基于模运算的索引分组思维,能显著简化网格数据处理、响应式布局计算及算法题中的周期性遍历场景。

















