使用lodash原地起飞,总结了几个常用的lodash方法

news2025/2/26 22:54:06

前言

 📫 大家好,我是南木元元,热爱技术和分享,欢迎大家交流,一起学习进步!

 🍅 个人主页:南木元元


目录

什么是lodash

lodash的按需引入

数组操作

求交集

求合集

求差集

求总和

求平均数

根据条件排序

数组分块

实用的工具函数

clone / 浅拷贝

cloneDeep / 深拷贝

debounce / 防抖

throttle / 节流

pick / 创建选中属性的对象

omit / 剔除对象某些属性

isEqual / 比较对象是否相等

isEmpty / 判断对象是否为空

结语


什么是lodash

Lodash是一个流行的JavaScript实用工具库,提供了许多高效、高兼容性的工具函数,能够方便地处理集合、字符串、数值、函数等多种数据类型,大大提高工作效率。

lodash的按需引入

有些人说lodash里面的好多方法都能自己实现,没必要再引入额外的工具库来增加项目的体积,但是你能保证你实现得比lodash好吗?而且lodash支持多种模块化方案,配合tree-shaking技术或者使用单独的函数模块,几乎不会导致冗余代码。

// 方式1:引入整个lodash对象
import _ from "lodash";
// 方式2:按名称引入特定的函数
import { cloneDeep } from "lodash";

// 上述2种方式都会引入整个lodash库,体积大,而下面2种方式都能实现按需引入,减小体积
// 1.只引入cloneDeep函数
import cloneDeep from "lodash/cloneDeep";
// 2.使用lodash-es
import { cloneDeep } from "lodash-es";

上述第一种方式只会引入引用路径对应的模块,第二种方式使用了es6模块语法的lodash-es(lodash默认是commonjs版本),这让 webpack等打包工具可以对其进行tree-shaking,去除无用的代码,减小打包体积。

接下来总结一些常用的lodash工具方法。

数组操作

求交集

intersection:返回一个包含所有传入数组交集元素的新数组。

_.intersection([2, 1], [4, 2], [1, 2]);  
// => [2]

intersectionBy:根据某个字段来进行计算交集。

_.intersectionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');  
// => [{ 'x': 1 }]

 intersectionWith:根据某个条件函数来计算交集,比如使用isEqual。

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];  
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];  
  
_.intersectionWith(objects, others, _.isEqual);  
// => [{ 'x': 1, 'y': 2 }]

求合集

union:返回一个新的联合数组。

_.union([2], [1, 2]);
// => [2, 1]

unionBy:根据某个字段来计算合集。

_.unionBy([2.1], [1.2, 2.3], Math.floor);
// => [2.1, 1.2]
 
_.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
// => [{ 'x': 1 }, { 'x': 2 }]

unionWith:根据某个条件函数来计算合集。

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
var others = [{ 'x': 1, 'y': 1 }, { 'x': 1, 'y': 2 }];
 
_.unionWith(objects, others, _.isEqual);
// => [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }, { 'x': 1, 'y': 1 }]

求差集

difference:计算两个数组的差集,返回在第一个数组中出现但不在第二个数组中出现的元素。

_.difference([3, 2, 1], [4, 2]);
// => [3, 1]

differenceBy:根据某个字段计算差集。

_.differenceBy([3.1, 2.2, 1.3], [4.4, 2.5], Math.floor);
// => [3.1, 1.3]
 
_.differenceBy([{ 'x': 2 }, { 'x': 1 }], [{ 'x': 1 }], 'x');
// => [{ 'x': 2 }]

differenceWith:根据某个条件函数计算差集。

var objects = [{ 'x': 1, 'y': 2 }, { 'x': 2, 'y': 1 }];
 
_.differenceWith(objects, [{ 'x': 1, 'y': 2 }], _.isEqual);
// => [{ 'x': 2, 'y': 1 }]

求总和

sum:返回总和。

_.sum([4, 2, 8, 6]);
// => 20

sumBy:根据某个字段计算并返回总和。

var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
 
_.sumBy(objects, function(o) { return o.n; });
// => 20
 
_.sumBy(objects, 'n');
// => 20

求平均数

mean:返回平均值。

_.mean([4, 2, 8, 6]);
// => 5

meanBy:根据某个字段计算出平均值。

var objects = [{ 'n': 4 }, { 'n': 2 }, { 'n': 8 }, { 'n': 6 }];
 
_.meanBy(objects, function(o) { return o.n; });
// => 5
 
_.meanBy(objects, 'n');
// => 5

根据条件排序

sortBy:返回排序后的数组。

var users = [
  { user: "fred", age: 48 },
  { user: "barney", age: 36 },
  { user: "fred", age: 40 },
  { user: "barney", age: 34 },
];
// 按年龄排序
console.log(_.sortBy(users, function(o) { return o.age; }));

结果:

数组分块

chunk:返回一个包含拆分区块的新数组。

constarr = [1,2,3,4,5,6,7,8,9];
console.log(_.chunk(arr,2));

结果:

实用的工具函数

clone / 浅拷贝

浅拷贝是创建一个新对象,如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址 (即浅拷贝只拷贝一层),所以如果其中一个对象改变了这个地址,就会影响到另一个对象。

const obj1 = [{a: 1 }];
const obj2 = _.clone(obj1);
console.log(obj1 === obj2); // false
console.log(obj1.a === obj2.a); // true

cloneDeep / 深拷贝

深拷贝是将一个对象从内存中完整的拷贝一份出来,从堆内存中开辟一个新的区域存放新对象,且修改新对象不会影响原对象。

const obj1 = [{a: 1 }];
const obj2 = _.cloneDeep(obj1);
console.log(obj1 === obj2); // false
console.log(obj1.a === obj2.a); // false

debounce / 防抖

作用:函数被触发多次,只有最后一次会被触发。用于限制函数执行的频率,如输入框的实时搜索,减少接口调用,节约服务器资源。

const fn = () => ({ 
   fetch('https://xxx.cn/api');
})
const res = _.debounce(fn, 3000);

throttle / 节流

作用:函数被触发多次,在指定时间范围内只会调用一次。用于监听页面scroll事件滚动加载,监听页面的resize事件等。

const fn = () => ({ 
   fetch('https://xxx.cn/api');
})
const res = _.throttle(fn, 300);

pick / 创建选中属性的对象

作用:从object中挑出对应的属性,返回一个新对象。

var object = { 'a': 1, 'b': '2', 'c': 3 };
 
_.pick(object, ['a', 'c']);
// => { 'a': 1, 'c': 3 }

结果:

omit / 剔除对象某些属性

作用:忽略掉某些属性后,剩下的属性组成一个新对象。

var object = { 'a': 1, 'b': '2', 'c': 3 };
 
_.omit(object, ['a', 'c']);
// => { 'b': '2' }

结果:

isEqual / 比较对象是否相等

const obj = { a: [{ b: 2 }] };
const obj1 = { a: [{ b: 2 }] };

const res = _.isEqual(obj, obj1);
console.log(res);
// 输出:true

isEmpty / 判断对象是否为空

const obj = {};
const res = _.isEmpty(obj);
console.log(res);
// 输出 true

结语

🔥如果此文对你有帮助的话,欢迎💗关注、👍点赞、⭐收藏✍️评论支持一下博主~     

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

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

相关文章

2024美赛数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

SystemC学习笔记 - Hello systemc world

Hello Systemc World 码农老规矩,先写一个hello world并输出,语法什么的后面再说,先能编译运行再说。 目录配置 使用examples里的配置,在examples/sysc目录下创建test目录,其下创建第一个test1的目录,如…

功能权限篇

文章目录 1. 如何设计一套权限系统1.1 目标1.2 权限模型1.2.1 模型一RBAC1.2.2 模型二ABAC 2.如何实现菜单的创建?2.1 表结构2.2 前端实现2.3 后端实现 3. 如何实现角色的创建?4.如何给用户分配权限 —— 将菜单赋予角色?5.如何给用户分配权限…

Linux学习之网络编程3(高并发服务器)

写在前面 Linux网络编程我是看视频学的,Linux网络编程,看完这个视频大概网络编程的基础差不多就掌握了。这个系列是我看这个Linux网络编程视频写的笔记总结。 高并发服务器 问题: 根据上一个笔记,我们可以写出一个简单的服务端…

您与此网站之间建立的连接不安全

连接不安全的主要原因之一是使用不安全的通信协议。在互联网传输中,如果使用的协议不加密,那么数据就容易受到窃听和篡改。另一个可能的原因是网站没有正确配置其安全证书,使得用户的连接没有得到适当的加密保护。 解决方法: 采用…

Android jar包编译及集成

Jar包编译和集成有两种编译方式,mk和bp,Android 7版本之后逐渐采用bp格式编译,目前14版本还是兼容mk方式编译,具体写法入下: Android jar包编译 mk: 如果需要打包到systemimg,则需要将此jar包添…

Ribbon学习思维导图

参考资料 1、OpenFeign与Ribbon源码分析总结与面试题 2、万字剖析OpenFeign整合Ribbon实现负载均衡的原理 3、扒一扒Nacos、OpenFeign、Ribbon、loadbalancer组件协调工作的原理 4、OpenFeign原来是这么基于Ribbon来实现负载均衡的

Gaara靶机练习

渗透测试 一.信息收集1.确定IP地址2.nmap扫描3.目录扫描 二.hydra爆破1.ssh连接2.信息探索 三.提权gdb提权提权 一.信息收集 1.确定IP地址 ┌──(root㉿kali)-[~/kali/web] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, IPv4: 192.168.9.10 S…

鸿蒙Harmony--AppStorage--应用全局的UI状态存储详解

无所求必满载而归,当你降低期待,降低欲望,往往会得到比较好的结果,把行动交给现在,用心甘情愿的态度,过随遇而安的生活,无论结果如何,都是一场惊喜的获得! 目录 一,定义 …

YOLOv7基础 | 手把手教你简化网络结构之yolov7.yaml(包括源码+封装步骤+网络结构图)

前言:Hello大家好,我是小哥谈。通过下载YOLOv7源码可知,原始的yolov7.yaml文件是拆开写的,比较混乱,也不好理解,并且为后续改进增添了很多困难。基于此种情况,笔者就给大家介绍一种将yolov7.yam…

算法训练day13Leetcode144 145 94 二叉树的前(中)(后)序遍历

今日学习的文章和视频链接 https://www.bilibili.com/video/BV1Hy4y1t7ij/?vd_source8272bd48fee17396a4a1746c256ab0ae 二叉树的种类 在我们解题过程中二叉树有两种主要的形式:满二叉树和完全二叉树。 满二叉树 满二叉树:如果一棵二叉树只有度为0的…

宝塔nginx部署前端页面刷新报404

问题: 当我们使用脚手架打包前端项目的时候,如果前端项目并没有静态化的配置,如以下 当我们刷新页面,或进行路由配置访问的时候就会报404的错误 原因: 这是因为通常我们做的vue项目属于单页面开发。所以只有index.html…

Abaqus汉化教程

用钢铁意志,成就不平凡人生。 今天博主整理了一下Abaqus2023汉化教程,希望大家学习。 第一步,在在菜单栏找到Abaqus CAE右键打开文件所在的位置 第二步:继续右键Abaqus CAE右键打开文件所在的位置 第三步:然后进入到…

PMP与NPDP证书:哪个更权威?哪个含金量更高?

🎯PMP和NPDP都具有权威性,但它们在领域和目标人qun方面略有不同。 1️⃣PMP在项目管理领域有较高的国际认可度 💎PMP是由项目管理协会(PMI)颁发的项目管理专业认证,具有较高的国际认可度。 PMP证书持有者通常具备严谨的项目管理知…

银行储蓄系统的顶层数据流图及细化数据流图

绘制出银行储蓄系统的顶层数据流图及细化数据流图; 银行储蓄系统存、取款流程如下: 1)业务员事先录入利率信息; 2)如果是存款,储户填写存款单,业务员将存款单键入系统,系统更新储户存…

【MATLAB源码-第111期】基于matlab的SCMA系统误码率仿真,采用polar码编码,输出误码率曲线。

操作环境: MATLAB 2022a 1、算法描述 SCMA(Sparse Code Multiple Access)系统是一种先进的多用户多输入多输出(MU-MIMO)通信系统,它采用了一种独特的多址访问技术,旨在提高无线通信网络的效率…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-7 LQR控制器 Linear Quadratic Regulator 线性控制器设计-轨迹跟踪(Fellow a Desired Path)

HCIA-Datacom题库(自己整理分类的)_09_Telnet协议【14道题】

一、单选 1.某公司网络管理员希望能够远程管理分支机构的网络设备,则下面哪个协议会被用到? RSTP CIDR Telnet VLSM 2.以下哪种远程登录方式最安全? Telnet Stelnet v100 Stelnet v2 Stelnet v1 解析: Telnet 明文传输…

一键调整播放倍速,调整播放倍速的软件

你是否曾因为长时间的视频而感到厌烦?或者因为视频播放得太快而错过了一些重要内容?现在,有了我们的【媒体梦工厂】,这些问题都将得到完美解决。不论你是想快速浏览长视频,还是想让视频慢下来以便更好地学习或欣赏&…

test-04-test case generate 测试用例生成 tcases 快速开始

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 自动生成测试用例 入门指南 关于…