悠悠楠杉
网站页面
正文:
在数据处理中,我们经常遇到需要将一个大数组按指定大小动态分割的场景。比如分页加载、批量请求或分布式计算时,动态分组能显著优化性能。本文将带你用原生JavaScript实现这一功能,并深入探讨边界条件和优化策略。
最基础的数组分割可通过循环和slice方法实现。假设要将数组[1,2,3,4,5]按每组2个元素分割:
function chunkArray(array, size) {
const result = [];
for (let i = 0; i < array.length; i += size) {
result.push(array.slice(i, i + size));
}
return result;
}
console.log(chunkArray([1, 2, 3, 4, 5], 2));
// 输出:[[1,2], [3,4], [5]]但实际需求往往更复杂,比如分组大小可能根据数据内容动态变化。
动态分组的核心是在遍历时实时计算分组边界。例如,按元素属性值的变化分组:
function dynamicChunk(array, getGroupKey) {
return array.reduce((result, item) => {
const key = getGroupKey(item);
const lastGroup = result[result.length - 1];
if (!lastGroup || lastGroup.key !== key) {
result.push({ key, items: [item] });
} else {
lastGroup.items.push(item);
}
return result;
}, []);
}
// 示例:按奇偶性动态分组
console.log(dynamicChunk([1, 3, 2, 4, 5], n => n % 2 === 0));
// 输出:[{key: false, items: [1,3]}, {key: true, items: [2,4]}, {key: false, items: [5]}]更复杂的场景可能需要结合两种策略。例如,每组合并最多3个同类型元素:
function hybridChunk(array, size, getGroupKey) {
return array.reduce((result, item) => {
const key = getGroupKey(item);
let lastGroup = result[result.length - 1];
if (!lastGroup || lastGroup.key !== key || lastGroup.items.length >= size) {
result.push({ key, items: [item] });
} else {
lastGroup.items.push(item);
}
return result;
}, []);
}while循环替代for可减少变量声明;function safeChunk(array, size) {
if (!Number.isInteger(size) || size <= 0) {
throw new Error('分组大小必须为正整数');
}
// ...剩余逻辑
}