当前位置: 首页 > 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 允许用户指定扁平化的深度,提供了更大的灵活性。

相关文章:

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

处理数组array的函数已经学习完&#xff0c;接下来是collection相关的函数&#xff0c; collection指的是一组用于处理集合&#xff08;如数组或对象&#xff09;的工具函数。 lodash源码研读之forEach,forEachRight,map,flatMap,flatMapDeep,flatMapDepth 一、源码地址 GitH…...

检测到“runtimelibrary”的不匹配项: 值“mtd_staticdebug”不匹配值“mdd_dynamic”

1. 解释“runtimelibrary”不匹配错误的含义 在Visual Studio中&#xff0c;LNK2038错误表示链接器检测到项目与其依赖的库之间存在“Runtime Library”&#xff08;运行时库&#xff09;的不匹配。具体来说&#xff0c;这意味着编译项目时使用的运行时库类型与编译依赖库时使…...

go clean -modcache命令清理缓存

go clean -modcache命令用于清理Go模块的本地缓存。Go模块缓存位于$GOPATH/pkg/mod/cache目录下&#xff0c;存储了所有下载和使用的模块版本。当执行go clean -modcache时&#xff0c;这个命令会删除该目录下的所有内容&#xff0c;迫使Go在下次构建时重新下载所有依赖的模块。…...

C#结构体排序(数组)

结构体排序&#xff08;数组&#xff09; 1 示例1.1 以PointF为例展示效果1.2 运行结果展示 2实际运用2.1 创建结构体2.2 调用示例2.3 运行结果展示 1 示例 1.1 以PointF为例展示效果 private void button1_Click(object sender, EventArgs e) {Random random new Random();…...

基于边缘智能网关的机房安全监测应用

随着我国工业互联网的扎实推进&#xff0c;越来越多地区积极建设信息基础设施&#xff0c;以充沛算力支撑产业物联网的可持续发展&#xff0c;数据机房就是其中的典型代表。而且随着机房规模的扩大&#xff0c;对于机房的安全管理难题挑战也日益增加。 面向数据机房安全监测与管…...

【Jenkins】自动化部署 maven 项目笔记

文章目录 前言1. Jenkins 新增 Maven 项目2. Jenkins 配置 Github 信息3. Jenkins 清理 Workspace4. Jenkins 配置 后置Shell脚本后记 前言 目标&#xff1a;自动化部署自己的github项目 过程&#xff1a;jenkins 配置、 shell 脚本积累 相关连接 Jenkins 官方 docker 指导d…...

LeetCode 3243. Shortest Distance After Road Addition Queries I

&#x1f517; https://leetcode.com/problems/shortest-distance-after-road-addition-queries-i 题目 有 n 个城市&#xff0c;编号 0 ~ n-1&#xff0c;从城市 i 到 i1 有一条路给若干高速路&#xff0c;表明从城市 u 到 v 有一条新增的路&#xff0c;v - u > 1返回每新…...

ML 系列:第 31 节— 机器学习中的协方差和相关性

文章目录 一、说明二、协方差和相关性2.1 协方差的概念2.1 相关 三、有关关联的高级主题 &#xff08;有关详细信息&#xff09;3.1 相关性和独立性3.2 零相关性和依赖性示例 四、相关性和因果关系五、结论 一、说明 协方差量化了两个随机变量协同变化的程度。当一个变量的较高…...

【鸿蒙】鸿蒙开发过程中this指向问题

文章目录 什么是 this&#xff1f;常见 this 指向问题案例分析&#xff1a;HarmonyOS 组件中的 this 指向问题问题描述问题分析原因 解决方案&#xff1a;绑定 this 的正确方法方法一&#xff1a;使用箭头函数方法二&#xff1a;手动绑定 this 完整代码示例使用箭头函数使用 bi…...

d3-contour 生成等高线图

D3.js 是一个强大的 JavaScript 库&#xff0c;用于创建动态、交互式数据可视化。d3-contour 是 D3.js 的一个扩展模块&#xff0c;用于生成等高线图&#xff08;contour plots&#xff09;。 属性和方法 属性 x: 一个函数&#xff0c;用于从数据点中提取 x 坐标。y: 一个函…...

Ubuntu20.04离线安装全教程(包括DellR940重置Raid 5、安装Ubuntu、设置root、安装nvidia英伟达显卡驱动及设置防火墙白名单)

本文记录重装Ubuntu20.04的所有记录&#xff0c;从服务器磁盘阵列重新排列、Ubuntu 20.04系统安装、配置root权限、安装Nvidia显卡驱动以及设置防火墙白名单的全部操作。 每一部分参考的博客的出处会放置于段落末尾&#xff0c;表示感谢&#xff01; 一、重置服务器磁盘阵列&…...

Spring Boot 3 集成 Spring Security(2)授权

文章目录 授权配置 SecurityFilterChain基于注解的授权控制自定义权限决策 在《Spring Boot 3 集成 Spring Security&#xff08;1&#xff09;》中&#xff0c;我们简单实现了 Spring Security 的认证功能&#xff0c;通过实现用户身份验证来确保系统的安全性。Spring Securit…...

【开篇】.NET开源 ORM 框架 SqlSugar 系列

01. 前言 ☘️ 1.1 什么是ORM? 对象-关系映射&#xff08;Object-Relational Mapping&#xff0c;简称ORM&#xff09;&#xff0c;面向对象的开发方法是当今企业级应用开发环境中的主流开发方法&#xff0c;关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对…...

参加面试被问到的面试题

1.在程序中如何开启事务&#xff1f; 在Java中&#xff0c;使用JDBC&#xff08;Java Database Connectivity&#xff09;与数据库交互时&#xff0c;你可以使用Connection对象的setAutoCommit方法来控制事务。默认情况下&#xff0c;autoCommit是开启的&#xff0c;这意味着每…...

第29天:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

时间轴&#xff1a; 演示案例&#xff1a; JS 原生开发-DOM 树-用户交互 DOM&#xff1a;文档操作对象 浏览器提供的一套专门用来操作网页代码内容的功能&#xff0c;实现自主或用户交互动作反馈 安全问题&#xff1a;本身的前端代码通过 DOM 技术实现代码的更新修改&#xff…...

react 的路由功能

1. 安装依赖 pnpm add react-router-dom 2. 基本的路由设置&#xff08;BrowserRouter&#xff09; 在 main.tsx 入口文件中使用BrowserRouter组件来包裹整个应用。它会监听浏览器的 URL 变化。 import { StrictMode } from "react";import { createRoot } from …...

SurfaceFlinger学习之一:概览

SurfaceFlinger 是 Android 系统中负责合成和显示屏幕内容的关键系统服务&#xff0c;它运行在一个专用的进程中 (system/bin/surfaceflinger)。它的主要职责是将不同应用程序的绘制内容&#xff08;即窗口或表面&#xff09;组合起来&#xff0c;通过硬件抽象层&#xff08;HA…...

Qt关于窗口一直调用paintEvent的踩坑实录

首先看以下代码&#xff1a; void ItemBlockWidget::paintEvent(QPaintEvent *ev) {// 先调用父类的 paintEvent 以执行默认绘制行为QWidget::paintEvent(ev);qDebug()<<"ItemBlockWidget重绘";QStyleOption opt;opt.initFrom(this);QPainter p(this);style()…...

C++11: STL之bind

C11: STL之bind 引言可调用对象的绑定绑定普通函数绑定静态函数绑定类成员函数绑定仿函数绑定Lambda 占位符std::placeholders的应用嵌套绑定参数重排序结合 STL 算法占位符传递到嵌套函数混合占位符与默认值复杂占位符组合 std::bind的原理std::bind 的设计思路简化实现示例 B…...

在线音乐播放器 —— 测试报告

自动化脚本源代码&#xff1a;Java: 利用Java解题与实现部分功能及小项目的代码集合 - Gitee.com 目录 前言 一、项目简介 1.项目背景 2.应用技术 &#xff08;1&#xff09;后端开发 &#xff08;2&#xff09;前端开发 &#xff08;3&#xff09;数据库 二、项目功能…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...

【机器视觉】单目测距——运动结构恢复

ps&#xff1a;图是随便找的&#xff0c;为了凑个封面 前言 在前面对光流法进行进一步改进&#xff0c;希望将2D光流推广至3D场景流时&#xff0c;发现2D转3D过程中存在尺度歧义问题&#xff0c;需要补全摄像头拍摄图像中缺失的深度信息&#xff0c;否则解空间不收敛&#xf…...

基础测试工具使用经验

背景 vtune&#xff0c;perf, nsight system等基础测试工具&#xff0c;都是用过的&#xff0c;但是没有记录&#xff0c;都逐渐忘了。所以写这篇博客总结记录一下&#xff0c;只要以后发现新的用法&#xff0c;就记得来编辑补充一下 perf 比较基础的用法&#xff1a; 先改这…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

抽象类和接口(全)

一、抽象类 1.概念&#xff1a;如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象&#xff0c;这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法&#xff0c;包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中&#xff0c;⼀个类如果被 abs…...