十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

es-toolkit 兼容层 eachRight 详解:forEachRight 的 Lodash 别名与逆序遍历实现

es-toolkit 兼容层 eachRight 详解:forEachRight 的 Lodash 别名与逆序遍历实现 es-toolkit 兼容层 eachRight 详解forEachRight 的 Lodash 别名与逆序遍历实现【免费下载链接】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-toolkiteachRight是 es-toolkit 兼容层es-toolkit/compat中为 Lodash 用户提供的forEachRight别名用于从右到左遍历数组、字符串与对象并对每个元素执行回调。本文结合 eachRight 兼容文档 与其目标文档 forEachRight 兼容文档并对照源码与测试完整讲解其用法、参数语义、提前终止机制与底层实现原理帮助你理解它和 es-toolkit 原生forEachRight的区别并做出正确的选型。eachRight 是什么别名背后的兼容设计在 Lodash 中_.each/_.eachRight分别是_.forEach/_.forEachRight的别名。es-toolkit 的兼容层compat为了降低 Lodash 迁移成本完整保留了这套命名。在 eachRight.ts 中实现只有一行export { forEachRight as eachRight } from ./forEachRight.ts;也就是说eachRight与forEachRight在运行时是同一个函数对象这一事实由测试直接验证。在 eachRight.spec.ts 中import { eachRight } from ./eachRight; import { forEachRight } from ./forEachRight; describe(eachRight, () { it(should be an alias of forEachRight, () { expect(eachRight).toBe(forEachRight); }); });该别名从兼容层入口 compat.ts第 14 行统一导出因此可以这样引入import { eachRight } from es-toolkit/compat;由于二者完全等价本文后续所有行为说明均以forEachRight的完整实现为准。基本用法数组、字符串、对象三种集合的逆序遍历forEachRight即eachRight接受一个集合和一个回调从右到左遍历import { forEachRight } from es-toolkit/compat; // 数组逆序遍历 forEachRight([1, 2, 3], (value, index) { console.log(value, index); }); // 输出: 3 2, 2 1, 1 0 // 字符串逆序遍历按字符 forEachRight(abc, (char, index) { console.log(char, index); }); // 输出: c 2, b 1, a 0 // 对象逆序遍历按自身可枚举字符串键 forEachRight({ a: 1, b: 2, c: 3 }, (value, key) { console.log(value, key); }); // 输出: 3 c, 2 b, 1 a回调函数收到三个参数value当前遍历到的元素 / 字符 / 属性值index或key对于数组是数字下标对于对象是属性键collection被遍历的原始集合本身。兼容层为forEachRight定义了多组重载签名见 forEachRight.ts分别覆盖数组ArrayIteratorT, any、类数组ListIteratorT, any、字符串StringIteratorany与对象ObjectIteratorT, any四种形态保证 TypeScript 调用时的类型收窄。参数与返回值根据兼容文档与实现签名参数定义如下参数类型说明collectionArrayLikeT \| Recordany, any \| string \| null \| undefined待遍历的集合可以是数组、类数组、对象、字符串或null/undefinedcallback(item: any, index: any, arr: any) unknown可选对每个元素执行的函数返回false可提前终止遍历默认为identity函数返回值原集合本身。即传入数组返回该数组传入对象返回该对象null/undefined原样返回。例如const array [1, 2, 3]; forEachRight(array, Boolean); // 返回 array 本身 引用相等这一点同样被 forEachRight.spec.ts 覆盖expect(forEachRight(array, Boolean)).toBe(array)。null / undefined 与缺省回调的处理与 Lodash 行为一致当集合为null或undefined时不会抛错而是直接原样返回import { forEachRight } from es-toolkit/compat; forEachRight(null, value console.log(value)); // null forEachRight(undefined, value console.log(value)); // undefined当省略回调时默认使用identity函数函数仅完成遍历并返回原集合const array [1, 2, 3]; const result forEachRight(array); // 使用 identity 作为回调 console.log(result array); // true提前终止回调返回 false 即中断遍历这是forEach系函数在 Lodash 兼容层的重要特性只要回调显式返回false严格等于false遍历立即停止import { forEachRight } from es-toolkit/compat; forEachRight([1, 2, 3, 4], value { console.log(value); if (value 2) { return false; // 中断遍历 } }); // 输出: 4, 3, 2在 forEachRight.spec.ts 中数组与对象场景的提前退出均有测试用例验证例如can exit early when iterating arrays、can exit early when iterating objects。注意中断判断使用的是result false的严格比较见下方实现代码因此返回其他假值如0、undefined并不会中断遍历。源码级实现原理兼容层forEachRight的核心实现位于 forEachRight.ts 的最后一个重载函数体内逻辑非常紧凑export function forEachRightT( collection: ArrayLikeT | Recordany, any | string | null | undefined, callback: (item: any, index: any, arr: any) unknown identity ): ArrayLikeT | Recordany, any | string | null | undefined { if (!collection) { return collection; } const keys: PropertyKey[] isArrayLike(collection) ? range(0, collection.length) : Object.keys(collection); for (let i keys.length - 1; i 0; i--) { const key keys[i]; const value (collection as any)[key]; const result callback(value, key, collection); if (result false) { break; } } return collection; }从中可以提炼出几个关键设计点空值短路if (!collection) return collection;直接处理null/undefined这也是兼容层相对原生版本多出的开销之一。键列表生成使用 isArrayLike 判断集合形态——类数组用 range 生成0..length-1的数字键普通对象用Object.keys取其自身可枚举字符串键。因此数组上自定义的属性如array.a 1不会被遍历原型链上的属性也不会被遍历测试should not iterate custom properties on arrays、iterates over own string keyed properties of objects分别验证了这两点。逆序循环从keys.length - 1递减到0实现从右到左的遍历顺序。提前终止result false时break。返回原集合遍历结束后返回传入的collection。此外由于键列表在进入循环前一次性生成遍历过程中对length的修改或新增属性不会影响本次遍历对应测试should ignore changes to length与should ignore added object properties同时稀疏数组会被当作稠密数组处理空缺位置以undefined参与回调对应测试should treat sparse arrays as dense。与 es-toolkit 原生 forEachRight 的区别及选型建议es-toolkit 在src/array/下提供了只针对数组的原生 forEachRightexport function forEachRightT(arr: readonly T[], callback: (value: T, index: number, arr: T[]) void): void { for (let i arr.length - 1; i 0; i--) { const element arr[i]; callback(element, i, arr as T[]); } }两者差异非常明显维度原生forEachRightes-toolkit/array兼容forEachRight/eachRightes-toolkit/compat适用集合仅数组readonly T[]数组、类数组、字符串、对象、null/undefined回调缺省必填可选默认为identity提前终止不支持支持返回false中断返回值void原集合类型检查类型严格需要兼容各种集合形态签名更宽泛兼容文档 forEachRight.md 顶部也明确给出了警告由于需要处理null/undefined、ArrayLike类型以及多种条件函数形式兼容版forEachRight运行更慢在新代码中应优先使用更快的原生 forEachRight。也就是说正在从 Lodash 迁移、需要保持行为完全一致的存量代码使用es-toolkit/compat的eachRight/forEachRight新写的代码如果只需要逆序遍历数组直接使用es-toolkit/array的原生forEachRight以获得更小的体积与更快的速度。小结eachRight是 es-toolkit 兼容层对 Lodash 命名习惯的忠实保留其本质是forEachRight的别名导出eachRight.ts二者共享同一实现。掌握其数组、字符串、对象的逆序遍历方式、false提前终止语义、null/undefined直通行为以及基于isArrayLikeObject.keys的键列表机制即可在 Lodash 迁移场景中无缝替换同时在追求性能的新代码中准确切换到原生版本。【免费下载链接】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),仅供参考
返回列表