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的函数已经学习完,接下来是collection相关的函数, collection指的是一组用于处理集合(如数组或对象)的工具函数。 lodash源码研读之forEach,forEachRight,map,flatMap,flatMapDeep,flatMapDepth 一、源码地址 GitH…...
检测到“runtimelibrary”的不匹配项: 值“mtd_staticdebug”不匹配值“mdd_dynamic”
1. 解释“runtimelibrary”不匹配错误的含义 在Visual Studio中,LNK2038错误表示链接器检测到项目与其依赖的库之间存在“Runtime Library”(运行时库)的不匹配。具体来说,这意味着编译项目时使用的运行时库类型与编译依赖库时使…...
go clean -modcache命令清理缓存
go clean -modcache命令用于清理Go模块的本地缓存。Go模块缓存位于$GOPATH/pkg/mod/cache目录下,存储了所有下载和使用的模块版本。当执行go clean -modcache时,这个命令会删除该目录下的所有内容,迫使Go在下次构建时重新下载所有依赖的模块。…...

C#结构体排序(数组)
结构体排序(数组) 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();…...

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

【Jenkins】自动化部署 maven 项目笔记
文章目录 前言1. Jenkins 新增 Maven 项目2. Jenkins 配置 Github 信息3. Jenkins 清理 Workspace4. Jenkins 配置 后置Shell脚本后记 前言 目标:自动化部署自己的github项目 过程:jenkins 配置、 shell 脚本积累 相关连接 Jenkins 官方 docker 指导d…...
LeetCode 3243. Shortest Distance After Road Addition Queries I
🔗 https://leetcode.com/problems/shortest-distance-after-road-addition-queries-i 题目 有 n 个城市,编号 0 ~ n-1,从城市 i 到 i1 有一条路给若干高速路,表明从城市 u 到 v 有一条新增的路,v - u > 1返回每新…...

ML 系列:第 31 节— 机器学习中的协方差和相关性
文章目录 一、说明二、协方差和相关性2.1 协方差的概念2.1 相关 三、有关关联的高级主题 (有关详细信息)3.1 相关性和独立性3.2 零相关性和依赖性示例 四、相关性和因果关系五、结论 一、说明 协方差量化了两个随机变量协同变化的程度。当一个变量的较高…...

【鸿蒙】鸿蒙开发过程中this指向问题
文章目录 什么是 this?常见 this 指向问题案例分析:HarmonyOS 组件中的 this 指向问题问题描述问题分析原因 解决方案:绑定 this 的正确方法方法一:使用箭头函数方法二:手动绑定 this 完整代码示例使用箭头函数使用 bi…...

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

Ubuntu20.04离线安装全教程(包括DellR940重置Raid 5、安装Ubuntu、设置root、安装nvidia英伟达显卡驱动及设置防火墙白名单)
本文记录重装Ubuntu20.04的所有记录,从服务器磁盘阵列重新排列、Ubuntu 20.04系统安装、配置root权限、安装Nvidia显卡驱动以及设置防火墙白名单的全部操作。 每一部分参考的博客的出处会放置于段落末尾,表示感谢! 一、重置服务器磁盘阵列&…...

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

【开篇】.NET开源 ORM 框架 SqlSugar 系列
01. 前言 ☘️ 1.1 什么是ORM? 对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对…...
参加面试被问到的面试题
1.在程序中如何开启事务? 在Java中,使用JDBC(Java Database Connectivity)与数据库交互时,你可以使用Connection对象的setAutoCommit方法来控制事务。默认情况下,autoCommit是开启的,这意味着每…...

第29天:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作
时间轴: 演示案例: JS 原生开发-DOM 树-用户交互 DOM:文档操作对象 浏览器提供的一套专门用来操作网页代码内容的功能,实现自主或用户交互动作反馈 安全问题:本身的前端代码通过 DOM 技术实现代码的更新修改ÿ…...
react 的路由功能
1. 安装依赖 pnpm add react-router-dom 2. 基本的路由设置(BrowserRouter) 在 main.tsx 入口文件中使用BrowserRouter组件来包裹整个应用。它会监听浏览器的 URL 变化。 import { StrictMode } from "react";import { createRoot } from …...

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

Qt关于窗口一直调用paintEvent的踩坑实录
首先看以下代码: 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…...

在线音乐播放器 —— 测试报告
自动化脚本源代码:Java: 利用Java解题与实现部分功能及小项目的代码集合 - Gitee.com 目录 前言 一、项目简介 1.项目背景 2.应用技术 (1)后端开发 (2)前端开发 (3)数据库 二、项目功能…...

VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?
Redis 的发布订阅(Pub/Sub)模式与专业的 MQ(Message Queue)如 Kafka、RabbitMQ 进行比较,核心的权衡点在于:简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...