资讯动态

es-toolkit/fp 的 chunkBy:按“相邻键变化“切分数组的函数式工具

发布时间:2026/9/16 17:49:39 来源:尧图企业网站定制
es-toolkit/fp 的 chunkBy按相邻键变化切分数组的函数式工具【免费下载链接】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-toolkitchunkBy是 es-toolkit 函数式编程入口es-toolkit/fp中用于按相邻键变化切分数组的操作符它返回一个数据后置data-last的函数从数组左侧向右遍历每当iteratee产出的键发生变化时开启一个新的分组非常适合作为pipe管道中的一个步骤。读完本文你将掌握chunkBy的调用方式、参数与返回值约定、与按固定长度切分的chunk的本质区别以及它在源码中的底层实现与测试验证依据。chunkBy 是什么chunkBychunk by key创建每当键发生变化就切分相邻值的函数。它关注的是键的连续性同一个键连续出现的元素归入同一个块一旦键切换就开启新块。这与把相同键的所有元素聚到一起的groupBy语义不同——chunkBy只聚合相邻的同键元素相同键若在中间被其他键隔开会形成多个独立的块。该辅助函数专属于es-toolkit/fp典型用法是与pipe组合作为管道中的一个步骤const result pipe(array, chunkBy(iteratee));从仓库源码结构看chunkBy在 src/fp/array/index.ts 中被导出并经 src/fp/index.ts 汇总到es-toolkit/fp包入口与pipe一起对外提供。快速上手与 pipe 组合使用chunkBy从左侧向右遍历被管道传入的数组只要iteratee返回相同的键就把相邻值归入同一块键一改变新的块随即开始import { chunkBy, pipe } from es-toolkit/fp; pipe( [1, 1, 2, 2, 1], chunkBy(value value) ); // [[1, 1], [2, 2], [1]]上例中键序列为1 → 1 → 2 → 2 → 1前两个1相邻同键合成一块两个2合成一块最后一个1虽然与开头的1键相同但因为中间隔了2无法与前面的块合并只能自成一块最终结果为[[1, 1], [2, 2], [1]]。这正是相邻分组的直观体现对应 src/fp/array/chunkBy.spec.ts 中的 pipe 测试用例。参数与返回值参数iteratee(value: T) unknown对每个值返回其分组键的函数。键的类型是unknown可以是任意值——数字、字符串、布尔值甚至对象引用。返回值(array: readonly T[]) T[][]一个把readonly T[]映射为相邻值块数组的函数。该函数是数据后置的接受数组作为唯一入参因此天然适配pipe的数据流方向。行为细节与边界语义键使用严格不等!比较在 src/array/chunkBy.ts 的实现中键与上一个键通过!严格不等比较相等的基本类型值如1与1、a与a会保持在同一块不同的对象引用即使结构完全相同也会被视为新键并开启新块。键去而复返会开启新块测试 src/array/chunkBy.spec.ts 专门验证了这一点chunkBy([1, 1, 2, 1, 1], value value)的结果是[[1, 1], [2], [1, 1]]即中间被2隔断后重新出现的1不再并入第一块。键来自 iteratee而非元素本身iteratee负责派生比较键键可以完全不同于元素。例如按字符串长度分组chunkBy([a, b, cd, ef, g], word word.length); // [[a, b], [cd, ef], [g]]对应测试见 src/array/chunkBy.spec.ts。全同与全异两种极端情况所有键都不同时每个元素自成一块chunkBy([1, 2, 3], value value)得到[[1], [2], [3]]所有键都相同时整个数组保持为单一块chunkBy([1, 2, 3], () same)得到[[1, 2, 3]]。布尔键等派生键场景按奇偶性等布尔键分组同样可行chunkBy([1, 3, 2, 4, 5], value value % 2 0)得到[[1, 3], [2, 4], [5]]。不修改输入数组chunkBy只读遍历并构建新数组不修改原始输入测试见 src/array/chunkBy.spec.ts。源码实现解析es-toolkit/fp的chunkBy只是一个柯里化封装真正逻辑位于通用数组模块。底层实现 src/array/chunkBy.ts 的核心思路非常简洁export function chunkByT(arr: readonly T[], iteratee: (value: T) unknown): T[][] { const result: T[][] []; let prevKey: unknown; for (let i 0; i arr.length; i) { const key iteratee(arr[i]); if (i 0 || key ! prevKey) { result.push([arr[i]]); } else { result[result.length - 1].push(arr[i]); } prevKey key; } return result; }算法要点单次线性遍历对每个元素调用一次iteratee计算键时间复杂度为 O(n)无嵌套循环首个元素特判i 0时无条件新建第一个块避免prevKey初始为undefined造成的误判增量维护前键每轮循环末尾把当前键写入prevKey供下一元素比较就地追加键未变时直接向当前块的末尾push保持元素原始顺序。函数式封装 src/fp/array/chunkBy.ts 则做了数据后置转换提前接收iteratee并返回(array: readonly T[]) T[][]内部再委托给chunkByToolkit从而与pipe的数据流模型无缝衔接——这正是pipe文档中描述的左到右函数组合方式的体现。与按固定长度切分的 chunk 的区别es-toolkit 还提供按固定长度切分的chunk实现见 src/array/chunk.ts。两者的切分依据完全不同工具切分依据示例输入输出chunk固定块大小size必须为正整数否则抛错chunk([1, 2, 3, 4, 5], 2)[[1, 2], [3, 4], [5]]chunkBy相邻元素的键是否变化严格不等比较chunkBy([1, 1, 2, 2, 1], v v)[[1, 1], [2, 2], [1]]一句话概括chunk按数量切分chunkBy按边界条件切分把连续同键的元素保持在一起。从源码注释src/array/chunkBy.ts也可以看到这一对比被显式说明。测试验证一览仓库为chunkBy提供了双份测试覆盖完整行为src/array/chunkBy.spec.ts验证空数组返回空数组、相邻同键聚合、键重现时开启新块、键由iteratee派生、全异键与全同键两种极端、布尔键分组以及不改动输入数组src/fp/array/chunkBy.spec.ts验证chunkBy在pipe管道中的正常工作。这些用例既是对文档语义的印证也为你复用时提供了可参考的边界清单。小结chunkBy是 es-toolkit/fp 中处理相邻分组场景的精准工具它把键是否发生变化抽象为切分边界配合pipe可以轻松嵌入到数据变换流程中且实现保持 O(n) 时间复杂度和不修改输入的纯函数特性。当你需要把连续相同或同键的相邻元素归组而又不想破坏去而复返的重现语义时chunkBy就是比固定长度chunk更贴切的选择。更多函数式入口可参考 docs/fp/intro.md。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价