es-toolkit/fp 函数式编程:chunk 分组函数详解与 pipe 组合实战
es-toolkit/fp 函数式编程chunk 分组函数详解与 pipe 组合实战【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit本篇技术指南聚焦 es-toolkit 函数式编程es-toolkit/fp子模块中的chunk算子讲解它如何将任意数组按指定长度切分为多个子数组并与pipe组合成数据流水线。读完本文你将掌握chunk(size)的柯里化调用方式、参数约束与异常行为、底层实现原理以及它和普通chunksrc/array/chunk.ts之间的差异与选型依据。chunk 在函数式编程中的定位在 es-toolkit 的fp子模块中所有函数都遵循data-last数据最后传入的柯里化约定先传入配置参数如分组长度size返回一个等待数据传入的函数再由pipe把初始值依次灌入整条流水线。chunk函数式编程版正是这样一个算子它创建一个将数组按给定长度拆分成子数组的函数典型用法如下const result pipe(array, chunk(size));文档明确提示在普通非流水线代码中应优先使用 es-toolkit 原生的chunk只有需要用pipe串联多个变换时才使用fp版。这是两者选型的核心准则——fp版的价值在于可组合性而非替代原生 API。使用方法柯里化与 pipe 组合chunk的调用模式是先给大小、后给数组。下面的示例来自官方文档docs/ja/fp/reference/chunk.mdimport { chunk, pipe } from es-toolkit/fp; pipe([1, 2, 3, 4, 5], chunk(2)); // [[1, 2], [3, 4], [5]] // 大小超过数组长度时整个数组成为单一的分组。 pipe([1, 2, 3], chunk(10)); // [[1, 2, 3]]行为要点chunk(2)返回一个接收数组的函数pipe将[1, 2, 3, 4, 5]传入后输出[[1, 2], [3, 4], [5]]当数组无法被size整除时最后一个分组包含剩余元素当size大于等于数组长度时只产生一个分组即原数组的浅拷贝切片。由于是柯里化设计chunk(2)本身可以被保存复用例如作为回调或预置操作符传入任意流水线import { pipe, map, chunk } from es-toolkit/fp; // 先放大 10 倍再按 2 个一组分组 pipe( [1, 2, 3, 4], map(x x * 10), chunk(2) ); // [[10, 20], [30, 40]]参数、返回值与异常参数参数类型说明sizenumber每个分组的长度必须是正整数返回值(array: readonly T[]) T[][]一个将readonly T[]映射为分组数组T[][]的函数。值得注意的是fp版接受readonly T[]输入类型签名上比普通版T[]更宽松适合与任意只读数组/元组类型协同工作。异常当size不是正整数即size 0或非整数时chunk会抛出错误。从源码src/array/chunk.ts可见其校验与报错信息if (!Number.isInteger(size) || size 0) { throw new Error(Size must be an integer greater than zero.); }也就是说0、-1、0.5、Math.PI等都会被拒绝。源码实现柯里化薄封装 原生算法fp版的实现非常轻量本质是对原生chunk的柯里化包装src/fp/array/chunk.tsimport { chunk as chunkToolkit } from ../../array/chunk.ts; export function chunkT(size: number): (array: readonly T[]) T[][] { return function (array: readonly T[]): T[][] { return chunkToolkit(array, size); }; }闭包捕获size等数据到达后再转发给底层实现。这意味着fp版与普通版共享完全相同的分组算法与校验逻辑不存在行为分叉。底层算法的核心src/array/chunk.tsconst chunkLength Math.ceil(arr.length / size); const result: T[][] Array(chunkLength); for (let index 0; index chunkLength; index) { const start index * size; const end start size; result[index] arr.slice(start, end); }先通过Math.ceil(arr.length / size)预分配结果数组长度避免动态扩容每个分组通过arr.slice(start, end)截取因此返回的是新数组浅拷贝不会修改原数组也没有嵌套引用问题空数组输入时chunkLength为 0直接返回[]。边界行为与测试验证仓库中的测试用例src/array/chunk.spec.ts 与 src/fp/array/chunk.spec.ts覆盖了全部关键边界空数组pipe([] as number[], chunk(2))返回[]非法 size0、-1、0.5、Math.PI均抛出Size must be an integer greater than zero.见 src/array/chunk.spec.ts恰好整除chunk([1, 2, 3, 4, 5, 6], 3)得到[[1, 2, 3], [4, 5, 6]]无法整除chunk([1, 2, 3, 4, 5, 6, 7], 2)得到[[1, 2], [3, 4], [5, 6], [7]]余数归入末组size 超过长度chunk([1, 2, 3, 4], 6)得到[[1, 2, 3, 4]]。fp测试还额外验证了与map等算子在pipe中组合src/fp/array/chunk.spec.ts确保类型与数据流正确衔接。此外原生测试使用fast-check进行属性测试property-based testing对任意数组与任意正整数size断言所有分组合并后与原数组完全一致、且除最后一组外每组长度恰好等于size见 src/array/chunk.spec.ts从数学上锁定了分组算法的正确性。与 pipe 的协作惰性融合机制fp版的最终价值体现在pipe的编排能力上。从 src/fp/pipe.ts 的实现看pipe会将连续出现的惰性lazy算子如map、filter、take等融合为一次遍历逐元素处理而不是每步生成中间数组。chunk属于非惰性算子会在其所在的处理阶段被逐组执行当它与惰性算子混排时pipe会按最大连续惰性/非惰性段分批执行chunkFunctions分组逻辑见 src/fp/pipe.ts保证分组操作始终基于前序步骤的完整结果。因此在实际使用中若流水线末尾接take(n)之类的短路算子应把chunk放在其之前或之后按需选择以控制中间结果的物化成本chunk不修改原数组适合与不可变数据处理风格搭配返回的T[][]可以直接作为后续map、flat等算子的输入形成分组 → 处理 → 展平的经典模式。使用建议总结何时用fp版在pipe/flow流水线中与其他算子组合时使用享受 contenteditable="false">【免费下载链接】es-toolkitA modern JavaScript utility library thats 2-3 times faster and up to 97% smaller, a major upgrade to lodash.项目地址: https://gitcode.com/GitHub_Trending/es/es-toolkit创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考