functionchunk(arr, size) { // 这个数组用于存储结果 var result = [];
for (var i = 0; i < arr.length; i += size) { // 这个数组用于存储临时的数组片段 var temp = []; for (var j = i; j < i + size; j++) { // 判断边界。可以思考一下,为什么不能写成 if (arr[j]) if (j < arr.length) { temp.push(arr[j]); } } result.push(temp); }
return result; }
解释
整体思路应该不难理解。外层的 i 用于确定截取的起始点。内层的 j 就是在 i 与 i + size 之间,读出每一个元素,并存储到 temp 中。每存好一个片段 (即内层循环结束),就把 temp 保存到 result 中
这个思路的关键在于选对 i 和 j 的初始值以及循环过程中增值。既然我们需要实现每 size 个元素为一个片段,那么我们肯定需要确定每次截取的起点和终点
我们用 i 来表示截取的起点,那么不难得出 i 的初始值为 0。增值应该为 size。跳出条件也很简单,只要 i < arr.length,我们就可以一直执行
用 j 来选取范围中的元素,因此 j 的初始值应该就为 i (注意,这个 i 是会变化的)。至于 j 的结束值,那么应该为 i + size。因为我们需要截取的是从 i 到 i + size 的元素。j 的增值显然应该为 j++,因为我们需要获取这个范围之内的所有元素
既然我们设置了 j 是从 i 到 i + size,那么就需要处理 i + size 超出数组长度的情况。简单考虑下这个例子,传入数组 [1, 2, 3, 4, 5],size 为 4,那么我们应该得到 [[1, 2, 3, 4], [5]]。当 i 为 0 的时候没有问题,但当第二次循环,即 i 为 4 的时候,这时 j 也为 4。而内层循环跳出条件,i + size 为 8,显然超出了原数组的长度。如果我们读取 arr[6],会得到 undefined,显然我们不想把这个结果放进 temp