当前位置: 首页 > news >正文

Loadsh源码分析-forEach,eachRight,map,flatMap,flatMapDeep,flatMapDepth

处理数组array的函数已经学习完,接下来是collection相关的函数, collection指的是一组用于处理集合(如数组或对象)的工具函数。

lodash源码研读之forEach,forEachRight,map,flatMap,flatMapDeep,flatMapDepth

一、源码地址

  •  GitHub 地址: GitHub - lodash/lodash: A modern JavaScript utility library delivering modularity, performance, & extras.
  • 官方文档地址: Lodash 官方文档

二、结构分析

forEach基于arrayEach,baseEach模块,forEachRight基于arrayEachRight,baseEachRight模块,map基于arrayMap,baseMap模块,flatMap,flatMapDeep,flatMapDepth基于baseFlatten模块。

三、函数介绍

下面依次介绍各个模块。

1.arrayEach模块

function arrayEach(array, iteratee) {var index = -1,length = array == null ? 0 : array.length;while (++index < length) {if (iteratee(array[index], index, array) === false) {break;}}return array;}

 arrayEach函数遍历数组中的每个元素,并对每个元素执行传入的迭代函数(iteratee)。如果迭代函数返回 false,遍历将提前终止。

2.baseEach函数

 function createBaseEach(eachFunc, fromRight) {return function(collection, iteratee) {if (collection == null) {return collection;}if (!isArrayLike(collection)) {return eachFunc(collection, iteratee);}var length = collection.length,index = fromRight ? length : -1,iterable = Object(collection);while ((fromRight ? index-- : ++index < length)) {if (iteratee(iterable[index], index, iterable) === false) {break;}}return collection;};}var baseEach = createBaseEach(baseForOwn);

createBaseEach 函数用于生成一个新的函数 baseEach。这个新函数 baseEach 可以用来遍历集合(如数组或对象),并对其中的每个元素执行指定的操作。

3.forEach函数

  function forEach(collection, iteratee) {var func = isArray(collection) ? arrayEach : baseEach;return func(collection, getIteratee(iteratee, 3));}

forEach 函数是一个更通用的函数,它可以根据传入的 collection 的类型选择不同的遍历方式。如果是数组,则使用 arrayEach 进行遍历;否则使用 baseEach 进行遍历。这个函数的作用类似于 Loaash 中的 _.each。

4.baseEachRight模块

  function arrayEachRight(array, iteratee) {var length = array == null ? 0 : array.length;while (length--) {if (iteratee(array[length], length, array) === false) {break;}}return array;}

 arrayEachRight 的函数,该函数用于从右到左遍历一个数组,并对每个元素执行指定的操作。

5.forEachRight函数

 var baseEachRight = createBaseEach(baseForOwnRight, true);
function forEachRight(collection, iteratee) {var func = isArray(collection) ? arrayEachRight : baseEachRight;return func(collection, getIteratee(iteratee, 3));}

baseEachRight 是通过调用 createBaseEach 函数并传入 baseForOwnRight 和 true 作为参数来创建的。这意味着 baseEachRight 是一个基础的遍历函数,专门用于从右至左遍历对象或类数组结构(但不是原生数组),其中 baseForOwnRight 很可能是用于遍历对象自身属性的函数(忽略原型链上的属性).

forEachRight 是一个更高级别的函数,它根据传入的 collection 是否是数组来决定使用哪个遍历函数。如果 collection 是数组,它使用 arrayEachRight(之前定义的,专门用于数组的从右至左遍历)。如果不是数组,它则使用 baseEachRight。

6.arrayMap模块

 function arrayMap(array, iteratee) {var index = -1,length = array == null ? 0 : array.length,result = Array(length);while (++index < length) {result[index] = iteratee(array[index], index, array);}return result;}

arrayMap函数用于对数组中的每个元素执行指定的操作函数(iteratee),并将结果存储在一个新的数组中返回。

 7.baseMap模块

  function baseMap(collection, iteratee) {var index = -1,result = isArrayLike(collection) ? Array(collection.length) : [];baseEach(collection, function(value, key, collection) {result[++index] = iteratee(value, key, collection);});return result;}

baseMap 函数用于对集合(collection)中的每个元素执行指定的操作函数(iteratee),并将结果存储在一个新的数组中返回。此函数不仅适用于数组,还适用于类数组对象(array-like 对象)。

8.map函数

   function map(collection, iteratee) {var func = isArray(collection) ? arrayMap : baseMap;return func(collection, getIteratee(iteratee, 3));}

map 函数用于对集合(collection)中的每个元素执行指定的操作函数(iteratee),并将结果存储在一个新的数组中返回。此函数根据 collection 的类型来决定使用哪个具体的映射函数。

9.baseFlatten模块

   function baseFlatten(array, depth, predicate, isStrict, result) {var index = -1,length = array.length;predicate || (predicate = isFlattenable);result || (result = []);while (++index < length) {var value = array[index];if (depth > 0 && predicate(value)) {if (depth > 1) {// Recursively flatten arrays (susceptible to call stack limits).baseFlatten(value, depth - 1, predicate, isStrict, result);} else {arrayPush(result, value);}} else if (!isStrict) {result[result.length] = value;}}return result;}

baseFlatten 的函数,该函数用于将嵌套的数组(即多维数组)展平为一维数组。函数支持指定展平的深度,并且可以根据条件选择是否严格展平。之前介绍过。

  • array: 要展平的数组。
  • depth: 展平的深度。如果为 0,则不进行展平;如果为 1,则展平一层;如果为 Infinity,则完全展平。
  • predicate: 用于判断数组元素是否可以展平的函数。如果未提供,则使用 isFlattenable 函数。
  • isStrict: 布尔值,表示是否严格展平。如果为 true,则只展平符合 predicate 条件的元素;如果为 false,则将所有元素添加到结果数组中。
  • result: 用于存储展平结果的数组。如果未提供,则创建一个空数组。

10.flatMap函数

 function flatMap(collection, iteratee) {return baseFlatten(map(collection, iteratee), 1);}

 flatMap 函数首先对集合中的每个元素应用指定的操作函数(iteratee),然后将生成的嵌套数组(或结果数组)展平一层

11.flatMapDeep函数

 function flatMapDeep(collection, iteratee) {return baseFlatten(map(collection, iteratee), INFINITY);}

flatMapDeep函数首先对集合中的每个元素应用指定的操作函数(iteratee),然后将生成的嵌套数组(或结果数组)完全展平,即无论嵌套多深都将所有元素展平为一维数组

12.flatMapDepth函数

  function flatMapDepth(collection, iteratee, depth) {depth = depth === undefined ? 1 : toInteger(depth);return baseFlatten(map(collection, iteratee), depth);}

flatMapDepth 的函数,该函数首先对集合中的每个元素应用指定的操作函数(iteratee),然后将生成的嵌套数组(或结果数组)展平到指定的深度

四、总结

forEach, forEachRight, map, flatMap, flatMapDeep, flatMapDepth 都是用于遍历和操作数组或对象的函数。

 forEach 和 forEachRight 的区别在于遍历顺序,forEachRight 从右到左遍历。

map 类似于 forEach,但 map 返回新数组,而 forEach 返回原数组或对象

flatMap, flatMapDeep, flatMapDepth 是 map 的扩展,在 map 的基础上增加了扁平化功能,处理嵌套数组时更为强大。flatMapDeep 比 flatMap 更深层次地扁平化嵌套数组。flatMapDepth 允许用户指定扁平化的深度,提供了更大的灵活性。

http://www.lryc.cn/news/492724.html

相关文章:

  • 检测到“runtimelibrary”的不匹配项: 值“mtd_staticdebug”不匹配值“mdd_dynamic”
  • go clean -modcache命令清理缓存
  • C#结构体排序(数组)
  • 基于边缘智能网关的机房安全监测应用
  • 【Jenkins】自动化部署 maven 项目笔记
  • LeetCode 3243. Shortest Distance After Road Addition Queries I
  • ML 系列:第 31 节— 机器学习中的协方差和相关性
  • 【鸿蒙】鸿蒙开发过程中this指向问题
  • d3-contour 生成等高线图
  • Ubuntu20.04离线安装全教程(包括DellR940重置Raid 5、安装Ubuntu、设置root、安装nvidia英伟达显卡驱动及设置防火墙白名单)
  • Spring Boot 3 集成 Spring Security(2)授权
  • 【开篇】.NET开源 ORM 框架 SqlSugar 系列
  • 参加面试被问到的面试题
  • 第29天:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作
  • react 的路由功能
  • SurfaceFlinger学习之一:概览
  • Qt关于窗口一直调用paintEvent的踩坑实录
  • C++11: STL之bind
  • 在线音乐播放器 —— 测试报告
  • 等保测评讲解:安全管理中心
  • vue3表单输入相关修饰符使用
  • CSS笔记(二)类名复用
  • TCP三次握手与四次挥手(TCP重传机制,2MSL)超详细!!!计算机网络
  • LCR 006. 两数之和 II - 输入有序数组
  • 网络安全在现代企业中的重要作用
  • 关于 EKS Bottlerocket AMI 版本与 Karpenter 配置的说明
  • Python实现人生重开模拟器
  • java——Spring Boot的配置加载顺序和优先级
  • 【21-30期】Java技术深度剖析:从分库分表到微服务的核心问题解析
  • CSS:怎么把网站都变成灰色