Loadsh源码分析-filter,find,findLast,reject,partition

lodash源码研读之filter,find,findLast,reject,partition

一、源码地址

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

二、结构分析

结构框图省略。

三、函数介绍

下面依次介绍各个模块。

1.filter函数

 function arrayFilter(array, predicate) {var index = -1,length = array == null ? 0 : array.length,resIndex = 0,result = [];while (++index < length) {var value = array[index];if (predicate(value, index, array)) {result[resIndex++] = value;}}return result;}function baseFilter(collection, predicate) {var result = [];baseEach(collection, function(value, index, collection) {if (predicate(value, index, collection)) {result.push(value);}});return result;}function filter(collection, predicate) {var func = isArray(collection) ? arrayFilter : baseFilter;return func(collection, getIteratee(predicate, 3));}

filter函数用于从集合(如数组或对象)中筛选出满足指定 predicate 函数的元素,并返回一个新的数组。

  • arrayFilter:专门用于数组过滤,通过索引遍历数组,效率较高。
  • baseFilter:通用过滤函数,适用于各种集合类型,通过 baseEach 遍历集合。
  • filter:对外公开的方法,根据集合类型选择合适的过滤函数,并处理 predicate。

2.reject函数

   function negate(predicate) {if (typeof predicate != 'function') {throw new TypeError(FUNC_ERROR_TEXT);}return function() {var args = arguments;switch (args.length) {case 0:return !predicate.call(this);case 1:return !predicate.call(this, args[0]);case 2:return !predicate.call(this, args[0], args[1]);case 3:return !predicate.call(this, args[0], args[1], args[2]);}return !predicate.apply(this, args);};}function reject(collection, predicate) {var func = isArray(collection) ? arrayFilter : baseFilter;return func(collection, negate(getIteratee(predicate, 3)));}

reject函数用于筛选数组或集合中不满足指定 predicate 函数的元素。

 使用 negate 函数对 predicate 进行取反处理,这样 arrayFilter 或 baseFilter 就会筛选出不满足原 predicate 的元素。

3.find函数

function baseFindIndex(array, predicate, fromIndex, fromRight) {var length = array.length,index = fromIndex + (fromRight ? 1 : -1);while ((fromRight ? index-- : ++index < length)) {if (predicate(array[index], index, array)) {return index;}}return -1;}function findIndex(array, predicate, fromIndex) {var length = array == null ? 0 : array.length;if (!length) {return -1;}var index = fromIndex == null ? 0 : toInteger(fromIndex);if (index < 0) {index = nativeMax(length + index, 0);}return baseFindIndex(array, getIteratee(predicate, 3), index);}var find = createFind(findIndex);

find函数用于在数组查找满足条件的元素的方法。

  • baseFindIndex:基础查找函数,用于在数组中查找满足条件的元素的索引,支持从左到右或从右到左查找。
  • findIndex:对外公开的函数,处理数组查找,支持指定起始索引,并调用 baseFindIndex 实现查找。
  • find:对外公开的函数,通过 findIndex 查找满足条件的元素,并返回该元素。

4.findLast函数

function baseFindIndex(array, predicate, fromIndex, fromRight) {var length = array.length,index = fromIndex + (fromRight ? 1 : -1);while ((fromRight ? index-- : ++index < length)) {if (predicate(array[index], index, array)) {return index;}}return -1;}function findLastIndex(array, predicate, fromIndex) {var length = array == null ? 0 : array.length;if (!length) {return -1;}var index = length - 1;if (fromIndex !== undefined) {index = toInteger(fromIndex);index = fromIndex < 0 ?nativeMax(length + index, 0) :nativeMin(index, length - 1);}return baseFindIndex(array, getIteratee(predicate, 3), index, true);}var findLast = createFind(findLastIndex);

findLast 函数用于在数组中从右向左查找满足条件的元素的方法。

  • baseFindIndex:基础查找函数,用于在数组中查找满足条件的元素的索引,支持从左到右或从右到左查找。
  • findLastIndex:对外公开的函数,处理数组从右向左查找,支持指定起始索引,并调用 baseFindIndex 实现查找。
  • findLast:对外公开的函数,通过 findLastIndex 查找满足条件的元素,并返回该元素。

5.partition函数

 function createAggregator(setter, initializer) {return function(collection, iteratee) {var func = isArray(collection) ? arrayAggregator : baseAggregator,accumulator = initializer ? initializer() : {};return func(collection, setter, getIteratee(iteratee, 2), accumulator);};}var partition = createAggregator(function(result, value, key) {result[key ? 0 : 1].push(value);}, function() {return [[],[]];});
//例子
var users = [{ 'user': 'barney',  'age': 36, 'active': true },{ 'user': 'fred',    'age': 40, 'active': false },{ 'user': 'pebbles', 'age': 28, 'active': true }
];var partitioned = partition(users, function(user) {return user.age > 30;
});console.log(partitioned);
// 输出:
// [
//   [{ 'user': 'barney',  'age': 36, 'active': true }, { 'user': 'fred',    'age': 40, 'active': false }],
//   [{ 'user': 'pebbles', 'age': 28, 'active': true }]
// ]

partition函数用于将集合分组的函数。它将集合中的元素根据某个条件分为两个数组:一个包含满足条件的元素,另一个包含不满足条件的元素。

四、总结

filter 和 reject 是筛选操作,分别返回满足和不满足条件的元素。

find 和 findLast 是查找操作,分别返回第一个满足条件的元素。

partition 是分组操作,将元素分为满足条件和不满足条件的两组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/64350.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之字符类型

要进行计算机程序设计&#xff0c;不仅仅进行科学数值类型计算&#xff0c;还需要处理一些文本信息&#xff0c;这就需要字符类型。在C中字符可以表示字母、符号等&#xff0c;在编程的时候&#xff0c;通常使用一对单引号括起来&#xff0c;例如&#xff1a;A,a,B,b,0等。字符…

Spring Boot 2.1.7 数据源自动加载过程详解

在 Spring Boot 中&#xff0c;数据源的自动配置是框架中一个关键功能&#xff0c;本文将以 Spring Boot 2.1.7 版本为例&#xff0c;详细讲解在单数据源情况下数据源是如何自动加载的。我们通过源码分析&#xff0c;追踪整个加载流程。 1. 自动配置类的发现 Spring Boot 使用…

Node.js第三方模块

1.npm 简介 npm:node package manager 是一个nodejs的包管理和开发工具。 2.npm作用 (提供第三方的安装模块) 1. 从npm服务器下载别人写的第三方js库包到本地使用。 2. 从npm服务器下载并安装第三方命令行程序到本地使用。 3. 将自己写的包或命令行程序上传到n…

剑指Offer 03比特位计数

只是记录 题目链接 题目链接 自己想出来的 第一种解法 思路简述 遍历[0,n]之间的数字&#xff0c;对于每一个数字按照二进制的方式展开&#xff0c;判断最低位置是否为1&#xff0c;若为1则1&#xff0c;反之不加&#xff0c;直到该数字等于0就停止。 public static int[] …

C# 23种设计模式(4)访问者模式(Visitor Pattern)

一、访问者模式介绍 访问者模式&#xff08;Visitor Pattern&#xff09;是一种行为设计模式&#xff0c;它允许你以一种新的方式来增加作用于一组对象的操作&#xff0c;而无需修改这些对象类的代码。访问者模式将数据操作与数据结构分离&#xff0c;适用于数据结构相对稳定但…

MySQL 锁机制详解

1 引言 在数据库系统中&#xff0c;锁是确保数据一致性和完整性的关键机制之一。MySQL提供了多种类型的锁来支持不同场景下的并发控制需求。本文将详细介绍MySQL中的主要锁类型&#xff0c;包括行级锁、表级锁、意向锁等&#xff0c;并探讨它们的工作原理及应用场景。 2 锁的基…

某j 全局控制输入框不能输入表情符

在FormItem.vue文件中的function handleRules()添加两处表情正则校验&#xff0c;代码如下 效果&#xff1a; function handleRules(): ValidationRule[] {const { rules: defRules [], component, rulesMessageJoinLabel, label, dynamicRules, required } props.schema;if…

java中File类

1、介绍 File类定义了一些与平台无关的方法来操作文件&#xff0c;可以通过调用File类中的方法&#xff0c;实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息&#xff0c;如文件所在的目录、文件长度、文件读写权限等。数据流可以将数据写入到文…

Linux高性能服务器编程 | 读书笔记 | 10. 高性能I/O框架库Libevent

10. 高性能I/O框架库Libevent Linux服务器程序必须处理三类事件&#xff08;I/O、信号和定时事件&#xff09;&#xff0c;在处理这三类事件时需要考虑以下问题&#xff1a; **统一事件源。**统一处理这三类事件既能使代码简单易懂&#xff0c;又能避免一些潜在的逻辑错误。实…

Javaweb web后端maven介绍作用安装

自动导入到这个项目 src是源代码 main主程序&#xff0c;核心代码 java是Java源代码 resources是项目配置文件 test测试相关的 maven概述 介绍 依赖在本地仓库查找&#xff0c;如果本地仓库有&#xff0c;用本地仓库的依赖&#xff0c;本地没有&#xff0c;连接中央仓库&…

云计算HCIP-OpenStack01

1.OpenStack是什么&#xff1f; 1.1OpenStack是虚拟机、裸金属、容器的云基础架构 虚拟机、裸金属、容器&#xff0c;三者的相同点在于他们都是计算资源的封装&#xff0c;其所需要的资源是高度重合的。同时&#xff0c;这三类资源都属于是最基础的计算资源&#xff0c;也是云或…

Ubuntu基础命令

1、重置密码及启用/禁用用户 sudo passwd root 在Ubuntu中禁用root用户&#xff0c;使用以下命令&#xff1a; sudo passwd -l root 在Ubuntu中禁用root帐户 sudo passwd root 在Ubuntu中启用root帐户 在Ubuntu中锁定账户 usermod -L username 在Ubuntu中解锁…

wazuh-modules-sca-scan

sca模块主函数wm_sca_main -> wm_sca_start 检查policy文件中的每一个项目wm_sca_check_policy static int wm_sca_check_policy(const cJSON * const policy, const cJSON * const checks, OSHash *global_check_list) {if(!policy) {return 1;}const cJSON * const id c…

python —— 常用命令行的命令

目 录 python命令行查看安装版本查看安装路径升级pip工具安装包升级包卸载安装包查看包的信息详情查询已安装的包查询可升级的包显示包所在目录及信息搜索包使用指定版本运行脚本运行常见错误 python命令行 产品研发中通常需要使用一些小工具来辅助调试功能&#xff0c;比如采…

基于单片机的智能窗帘(论文+源码)

1.系统设计 本课题智能窗帘系统的设计主要包括STM32单片机主控模块&#xff0c;光照检测模块&#xff0c;窗帘控制模块&#xff0c;键盘控制模块&#xff0c;显示模块和时钟模块等几个部分。总体设计框图如图2.1所示&#xff0c;其可以实现对当前光照强度的实时检测&#xff0…

21 go语言(golang) - gin框架安装及使用(二)

四、组成 前面的文章中&#xff0c;我们介绍了其中一部分组成&#xff0c;接下来继续学习&#xff1a; Router&#xff08;路由器&#xff09; Gin 使用基于树结构的路由机制来处理 HTTP 请求。它支持动态路由参数、分组路由以及中间件。路由器负责将请求路径映射到相应的处理…

Fastdfs V6.12.1集群部署(arm/x86均可用)

文章目录 一、 Fastdfs 介绍二、部署 信息三、步骤tracker/storage 机器的 compose 内容storage 机器的 composetracker 与 storage 启动目录层级与配置文件测试测试集群扩容与缩减注意事项 一、 Fastdfs 介绍 FastDFS 是一款高性能的分布式文件系统&#xff0c;特别适合用于存…

零基础开始学习鸿蒙开发-基础页面的设计

目录 1.样例图 2.逐项分析 2.1 头顶布局分析&#xff1a;首先我们要把第一行的图标绘制出来&#xff0c;一个左一个右&#xff0c;很明显&#xff0c;需要放在一个Row容器中&#xff0c;具体代码如下&#xff1a; 2.2 和头像同一行的布局&#xff0c;需要注意的是&#xff0c…

如何用细节提升用户体验?

前端给用户反馈是提升用户体验的重要部分&#xff0c;根据场景选择不同的方式可以有效地提升产品的易用性和用户满意度。以下是常见的方法&#xff1a; 1. 视觉反馈 用户执行了某些操作后&#xff0c;需要即时确认操作结果。例如&#xff1a;按钮点击、数据提交、页面加载等。…

[数据结构#2] 图(1) | 概念 | 邻接矩阵 | 邻接表 | 模拟

图是由顶点集合及顶点间的关系&#xff08;边&#xff09;组成的数据结构&#xff0c;可用 G ( V , E ) G(V,E) G(V,E)表示&#xff0c;其中&#xff1a; 顶点集合 V V V: V { x ∣ x ∈ 某数据对象集 } V\{x|x\in\text{某数据对象集}\} V{x∣x∈某数据对象集}&#xff0c;…