/**
* 将数组按指定大小分割为若干子数组。此函数的行为与[PHP的array_chunk](http://php.net/manual/en/function.array-chunk.php)函数一致,
* 因此如果输入数组的长度不能被分割大小整除,则会在末尾插入较小的子数组。
*
* `x` 应为一个数组,`chunkSize` 应为一个正整数。
* 数组 `x` 可以包含任意类型的数据。
*
* @param {Array} x 样本数据数组
* @param {number} chunkSize 每个子数组的大小,必须为正整数
* @returns {Array<Array>} 分割后的二维数组
* @throws {Error} 如果分割大小小于1或不是整数,则抛出错误
* @example
* chunk([1, 2, 3, 4, 5, 6], 2);
* // => [[1, 2], [3, 4], [5, 6]]
*/
function chunk(x, chunkSize) {
// 存储分割结果的二维数组
const output = [];
// `chunkSize` 必须大于零,否则在下面的循环中,
// 调用 `start += chunkSize` 会导致无限循环。
// 因此,我们在此检测并抛出异常以指示无效输入。
if (chunkSize < 1) {
throw new Error("分割大小必须为正数");
}
if (Math.floor(chunkSize) !== chunkSize) {
throw new Error("分割大小必须为整数");
}
// `start` 是 `.slice` 方法开始选择新数组元素的索引
for (let start = 0; start < x.length; start += chunkSize) {
// 对于每个子数组,使用 `.slice` 方法提取部分数组并将其添加到输出结果中。
// `.slice` 方法不会改变原始数组。
output.push(x.slice(start, start + chunkSize));
}
return output;
}
export default chunk;