Lodash——使用与实例

1. 简介

  • Lodash是一个一致性、模块化、高性能的JavaScript实用库。
  • Lodash通过降低array、number、objects、string等等的使用难度从而让JavaScript变得简单。Lodash的模块方法,非常适用于:
    • 遍历array、object 和 string
    • 对值进行操作和检测
    • 创建符合功能的函数

1.1 安装

  • 浏览器环境: <script src="lodash.js"></script>
  • npm安装:npm i --save lodash
  • Node.js环境中:
    • // Load the full build.
      var _ = require('lodash');
    • // Load the core build.
      var _ = require('lodash/core');
    • // Load the FP build for immutable auto-curried iteratee-first data-last methods.
      var fp = require('lodash/fp');
    • // Load method categories.
      var array = require('lodash/array');
      var object = require('lodash/fp/object');
    • // Cherry-pick methods for smaller browserify/rollup/webpack bundles.
      var at = require('lodash/at');
      var curryN = require('lodash/fp/curryN');

2. API介绍之数组

2.1 _.drop(array, [n=1])

  • 创建一个切片数组,去除array前面的n个元素。(n默认为1)。返回array剩余切片。

2.1.1 API讲解示例

_.drop([1, 2, 3]);
// => [2, 3]_.drop([1, 2, 3], 2);
// => [3]_.drop([1, 2, 3], 5);
// => []_.drop([1, 2, 3], 0);
// => [1, 2, 3]

2.1.2 业务场景:

行情部分本身后端会返回全部规格信息数组,但只要求展示两个规格品类信息,若有三个及以上规格,默认展示除"通货"外的前两个需求。通货默认在第一个,所以我们可以通过 _.drop(arr, 1)来实现。

webapp-hq中:
this.specs = res.result.spec.slice(1);
---To---
this.specs = _.drop(res.result.spec, 1);

2.1.3 相似API

  • _.dropRight(array, [n=1]) 从末尾开始进行删除
  • _.dropWhile(array, [predicate=_.identity]) 从头开始删除迭代器指定情形下的值,返回剩余值
  • _.dropRightWhile(array, [predicate=_.identity]) 同上功能,只不过从后面开始删除

2.1.3 dropWhile对应业务场景 TODO:待补充

类似于filter,返回一堆数据,过滤出自己真正想要的数据,找个例子

2.2 _.head(array)

获取数组array的第一个元素。

2.2.1 API讲解示例

_.head([1, 2, 3]);
// => 1_.head([]);
// => undefined

2.2.2 业务场景

if (!this.specId || this.specId === 0 || this.specId === "0") {this.specId =this.specs &&this.specs.length &&this.specs[0] &&this.specs[0].id;console.log(this.specId, "自己获取的");// this.specId = _.head(this.specs) && _.head(this.specs).id;// console.log(this.specId, "lodash获取的");this.$emit("changeSpec", this.specId);
}

2.2.3 相似API

  • _.first 别名

2.3 _.take(array, [n=1])

创建一个数组切片,从array数组的起始元素开始提取n个元素。

2.3.1 API 讲解示例

_.take([1, 2, 3]);
// => [1]_.take([1, 2, 3], 2);
// => [1, 2]_.take([1, 2, 3], 5);
// => [1, 2, 3]_.take([1, 2, 3], 0);
// => []

2.3.2 业务场景

  • 当规格较多时,我们只想保留前几条数据用于展示时,可以使用该API
  • 我们可以先切掉头部内容,之后再进行take提取
this.specs = _.take(_.drop(res.result.spec, 1));
  • 若最后规格表示最新出现的,可以通过takeRight进行提取

2.3.3 相似API

  • _.takeRight(array, [n=1]) 创建一个数组切片,从array数组的最后一个元素开始提取n个元素。
  • _.takeRightWhile(array, [predicate=_.identity]) 从array数组的最后一个元素开始提取元素,直到 predicate 返回假值。predicate 会传入三个参数: (value, index, array)。
  • _.takeWhile(array, [predicate=_.identity]) 从array数组的起始元素开始提取元素,,直到 predicate 返回假值。predicate 会传入三个参数: (value, index, array)。

3. API介绍之集合

3.1 _.filter(collection, [predicate=_.identity])

遍历 collection(集合)元素,返回 predicate(断言函数)返回真值 的所有元素的数组。 predicate(断言函数)调用三个参数:(value, index|key, collection)。

3.1.1 API讲解示例

var users = [{ 'user': 'barney', 'age': 36, 'active': true },{ 'user': 'fred',   'age': 40, 'active': false }
];_.filter(users, function(o) { return !o.active; });
// => objects for ['fred']// The `_.matches` iteratee shorthand.
_.filter(users, { 'age': 36, 'active': true });
// => objects for ['barney']// The `_.matchesProperty` iteratee shorthand.
_.filter(users, ['active', false]);
// => objects for ['fred']// The `_.property` iteratee shorthand.
_.filter(users, 'active');
// => objects for ['barney']

3.1.2 业务场景

当返回一个规格列表/任意对象列表,需要按照要求来过滤其中自己需要的数据,这时候需要用到_.filter进行过滤比较方便。

const testArr = [{id: 1,name: '二两',isShow: true},{id: 2,name: '四两',isShow: false},{id: 3,name: '六两',isShow: true},{id: 4,name: '八两',isShow: true},{id: 5,name: '十两',isShow: false},]
const filterArr = testArr.filter((item) => item.isShow)const filterArr = _.filter(testArr, ['isShow', true])
const filterArr = _.filter(testArr, 'isShow')

3.2 _.find(collection, [predicate=_.identity], [fromIndex=0])

遍历 collection(集合)元素,返回 predicate(断言函数)第一个返回真值的第一个元素。predicate(断言函数)调用3个参数: (value, index|key, collection)。

3.2.1 API讲解示例

var users = [{ 'user': 'barney',  'age': 36, 'active': true },{ 'user': 'fred',    'age': 40, 'active': false },{ 'user': 'pebbles', 'age': 1,  'active': true }
];_.find(users, function(o) { return o.age < 40; });
// => object for 'barney'// The `_.matches` iteratee shorthand.
_.find(users, { 'age': 1, 'active': true });
// => object for 'pebbles'// The `_.matchesProperty` iteratee shorthand.
_.find(users, ['active', false]);
// => object for 'fred'// The `_.property` iteratee shorthand.
_.find(users, 'active');
// => object for 'barney'

3.2.2 业务场景

大讲堂中,detail接口中返回了多个模块的数据,以code为标识在这里插入图片描述
此时,我们将数据分别提取出来进行使用。

历史用法:
this.headerList =res.data.find((item) => {return item.code === "top_banner";
}).nodes || [];lodash用法:
this.headerList = _.find(res.data, ['code', 'top_banner']).nodes || []

3.2.3 相似API

  • _.findLast(collection, [predicate=_.identity], [fromIndex=collection.length-1]) 类似于find,查到一个就停止,不同之处在于find是从左向右查找,findLast是从右向左查找。

3.3 _.sample(collection)

从collection(集合)中获得一个随机元素。

3.3.1 API讲解示例

_.sample([1, 2, 3, 4]);
// => 2const arr = [{name: 'lihua',age: 12,},{name: 'xiaoming',age: 32,},{name: 'wang',age: 28,},];
_.sample(arr)
// => {name: 'lihua', age: 12}

3.3.2 业务场景

平台专享处的轮播,会随机选取姓氏进行处理,通过Math.random()方式,我们可以通过_.sample来进行改写。

surnameArr 常见姓氏列表(取样集合)const randomIdx = Math.floor(Math.random() * 43);
return surnameArr[randomIdx];return _.sample(surnameArr);

3.3.3 相似API

  • _.sampleSize(collection, [n=1]) 从collection集合中随机获取n个元素
_.sampleSize([1, 2, 3], 2);
// => [3, 1]_.sampleSize([1, 2, 3], 4);
// => [2, 3, 1]

4. API介绍之Seq

5. API介绍之语言

5.1 _.eq(value, other)

执行SameValueZero 比较两者的值,来确定它们是否相等。

5.1.1 API讲解示例

var object = { 'a': 1 };
var other = { 'a': 1 };_.eq(object, object);
// => true_.eq(object, other);
// => false_.eq('a', 'a');
// => true_.eq('a', Object('a'));
// => false_.eq(NaN, NaN);
// => true

5.1.2 业务场景

当有需求需要判断两个值是否相等时,如:判断当前是否是vip

!_.eq(this.customer_vip, 0);this.customer_vip !== 0;

5.1.3 相似API

  • _.gt(value, other) 检查value是否大于other
  • _.gte(value, other) 检查value是够大于等于other
  • _.isEqual(value, other) 执行深比较来确定两者的值是否相等。支持比较 arrays, array buffers, booleans, date objects, error objects, maps, numbers, Object objects, regexes, sets, strings, symbols, 以及 typed arrays. Object 对象值比较自身的属性,不包括继承的和可枚举的属性。 不支持函数和DOM节点比较。
  • _.isEqualWith(value, other, [customizer]) 这个方法类似_.isEqual。 除了它接受一个 customizer 用来定制比较值。
  • _.lt(value, other) 检查 value 是否小于 other。
  • _.lte(value, other) 检查 value 是否小于等于 other。

5.2 _.isEmpty(value)

检查 value 是否为一个空对象,集合,映射或者set。 判断的依据是除非是有枚举属性的对象,length 大于 0 的 arguments object, array, string 或类jquery选择器。

5.2.1 API讲解示例

_.isEmpty(null);
// => true_.isEmpty(true);
// => true_.isEmpty(1);
// => true_.isEmpty([1, 2, 3]);
// => false_.isEmpty({ 'a': 1 });
// => false

5.1.2 业务场景

我们经常为了兼容,获取数组中第一个元素进行压中或发送下一个网络请求的操作,之前是要判断这个数组是否存在,并且数组的length属性。&&下来就会使整个判断条件变得十分的长和复杂,此时,可以通过isEmpty来进行判断。

            this.trend_id =this.trendChartOptions &&this.trendChartOptions.length &&this.trendChartOptions[0] &&this.trendChartOptions[0].id;this.trendChartActive = this.trendChartOptions[0];-----this.trend_id =!_.isEmpty(this.trendChartOptions) &&this.trendChartOptions[0].id;

6. API介绍之对象

6.1 _.get(object, path, [defaultValue])

根据 object对象的path路径获取值。 如果解析 value 是 undefined 会以 defaultValue 取代。返回解析后的值。

6.1.1 API讲解示例

var object = { 'a': [{ 'b': { 'c': 3 } }] };_.get(object, 'a[0].b.c');
// => 3_.get(object, ['a', '0', 'b', 'c']);
// => 3_.get(object, 'a.b.c', 'default');
// => 'default'

6.1.2 业务场景

在进行图表数据存储时对象进行存储,key作为几天的id,value则是这一天对应的数据。

    const daysMap = {0: ['七', '天', '图', '表', '数', '据'],3: ['三', '十', '天', '图', '表', '数', '据'],6: ['六', '十', '天', '图', '表', '数', '据'],}console.log(_.get(daysMap, 0, ['默', '认', '图', '表', '数', '据']));

这样,我们在点击对应的activeOptions(七天、30天、60天)时,即可获取当天对应的id,然后通过id就可以获取到当天对应的数据。

6.1.3 相似API

  • _.result(object, path, [defaultValue]) 这个方法类似_.get, 除了如果解析到的值是一个函数的话,就绑定 this 到这个函数并返回执行后的结果。

  • _.set(object, path, value) 设置 object对象中对应 path 属性路径上的值,如果path不存在,则创建。 缺少的索引属性会创建为数组,而缺少的属性会创建为对象。 使用_.setWith 定制path创建。

  • _.setWith(object, path, value, [customizer]) 这个方法类似_.set,除了它接受一个 customizer,调用生成对象的 path。 如果 customizer 返回 undefined 将会有它的处理方法代替。 customizer 调用3个参数: (nsValue, key, nsObject)。

6.2 _.invoke(object, path, [args])

调用object对象path上的方法。

6.2.1 API讲解示例

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

6.2.2 业务场景

之前有一次后端处理数据有误,7天和30天请求时都返回了30天的数据,因为后期开发需要时间,所以需要前端暂时将返回的30天数据截取7天来进行使用,此时,我们就可以通过invoke进行截取。

    const daysDataMap = {0: {trend: {price_list: [{tem: "1.01",time: "04-26",},{tem: "1.81",time: "04-27",},{tem: "2.01",time: "04-28",},{tem: "1.51",time: "04-29",},{tem: "0.91",time: "04-30",},{tem: "1.31",time: "05-01",},{tem: "1.11",time: "05-02",},]}}}console.log(_.invoke(daysDataMap, '0.trend.price_list.slice', 0, 3))

6.3 _.omitBy(object, [predicate=_.identity])

这个方法一个对象,这个对象忽略 predicate(断言函数)判断不是真值的属性后,object自身和继承的可枚举属性组成。predicate调用与2个参数:(value, key)。

6.3.1 API讲解示例

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

6.3.2 业务场景

过滤接口参数,若不同场景有的参数存在,则不必传给后端。

      let queryParams = {stateCode: options.stateCode,customerId: options.qrid,};之前过滤参数写法:Object.entries(queryParams).forEach((f) => {if (!(f && f.length && f[1])) {delete queryParams[f[0]];}});console.log(queryParams, "之前方式过滤后的参数值");lodash 过滤参数写法:const lodashRes = _.omitBy(queryParams, _.isEmpty);console.log(lodashRes, "lodash处理后的值");

6.3.3 相似API

  • _.omit(object, [props]) 这个方法一个对象,这个对象由忽略属性之外的object自身和继承的可枚举属性组成。(注:可以理解为删除object对象的属性)。
var object = { 'a': 1, 'b': '2', 'c': 3 };_.omit(object, ['a', 'c']);
// => { 'b': '2' }
  • _.pick(object, [props]) 创建一个从 object 中选中的属性的对象。
var object = { 'a': 1, 'b': '2', 'c': 3 };_.pick(object, ['a', 'c']);
// => { 'a': 1, 'c': 3 }
  • _.pickBy(object, [predicate=_.identity]) 创建一个对象,这个对象组成为从 object 中经 predicate 判断为真值的属性。 predicate调用2个参数:(value, key)。
var object = { 'a': 1, 'b': '2', 'c': 3 };_.pickBy(object, _.isNumber);
// => { 'a': 1, 'c': 3 }

Seq、函数

总结:

  • 处理数组对象时的 js 方法例如 forEach、map、filter、reduce、find等,使用lodash封装好的会更加整洁、代码行数更少。

注意事项

注意事项一: lodash在不同平台上的使用情况

  • 微信小程序可通过该方法引入lodash

如果有用,点个赞呗~

总结用法,希望可以帮助到你,
我是Ably,你无须超越谁,只要超越昨天的自己就好~

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

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

相关文章

字符个数统计(同类型只统计一次)

思路&#xff1a;因为题目圈定出现的字符都是 ascii 值小于等于127的字符&#xff0c;因此只需要定义一个标记数组大小为128 &#xff0c;然后将字符作为数组下标在数组中进行标记&#xff0c;若数组中没有标记过表示第一次出现&#xff0c;进行计数&#xff0c;否则表示重复字…

简单线性回归:预测事物间简单关系的利器

文章目录 &#x1f340;简介&#x1f340;什么是简单线性回归&#xff1f;&#x1f340;简单线性回归的应用场景使用步骤&#xff1a;注意事项&#xff1a; &#x1f340;代码演示&#x1f340;结论 &#x1f340;简介 在数据科学领域&#xff0c;线性回归是一种基本而强大的统…

Kali Linux助您网络安全攻防实战

Kali Linux&#xff1a;黑客与防御者的神器 Kali Linux是一款专为网络安全测试和攻防实践而设计的操作系统。它汇集了大量的安全工具&#xff0c;可以用于渗透测试、漏洞扫描、密码破解等任务&#xff0c;不仅为黑客提供了强大的攻击能力&#xff0c;也为安全防御者提供了测试和…

Kafka 入门到起飞 - 什么是 HW 和 LEO?何时更新HW和LEO呢?

上文我们已经学到&#xff0c; 一个Topic&#xff08;主题&#xff09;会有多个Partition&#xff08;分区&#xff09;为了保证高可用&#xff0c;每个分区有多个Replication&#xff08;副本&#xff09;副本分为Leader 和 Follower 两个角色&#xff0c;Follower 从Leader同…

爬虫逆向实战(十八)--某得科技登录

一、数据接口分析 主页地址&#xff1a;某得科技 1、抓包 通过抓包可以发现数据接口是AjaxLogin 2、判断是否有加密参数 请求参数是否加密&#xff1f; 查看“载荷”模块可以发现有一个password加密参数和一个__RequestVerificationToken 请求头是否加密&#xff1f; 无…

【Linux】Reactor模式

Reactor模式 Reactor模式的定义 Reactor反应器模式&#xff0c;也叫做分发者模式或通知者模式&#xff0c;是一种将就绪事件派发给对应服务处理程序的事件设计模式。 Reactor模式的角色构成 Reactor主要由以下五个角色构成&#xff1a; reactor模式的角色 角色解释Handle(句…

保姆级别讲解Python数据处理,你绝对能会

名字&#xff1a;阿玥的小东东 学习&#xff1a;Python、C/C 主页链接&#xff1a;阿玥的小东东的博客_CSDN博客-python&&c高级知识,过年必备,C/C知识讲解领域博主 目录 1. 文件读取 2. 数据处理 3. 处理结果输出 总的来说 为了咱们让程序跑起来&#xff0c;我们需…

DAY3,ARM(LED点灯实验)

1.汇编实现开发板三盏灯点亮熄灭&#xff1b; .text .global _start _start: /**********LED123点灯**************/RCC_INIT:1使能PE10 PF10 PE8RCC..寄存器,E[4]1 F[5]1 0x50000a28ldr r0,0x50000a28ldr r1,[r0]orr r1,r1,#(0x3 << 4)str r1,[r0]LED1_INET:2初始化LED…

酷开系统 | 酷开科技大数据,更好的与目标消费人群建立联系

众所周知&#xff0c;OTT的一大优势在于强曝光&#xff0c;能够给消费者带来强烈的视觉冲击&#xff0c;强化品牌认知。但是&#xff0c;要想达到提升品牌认知&#xff0c;首先要保证OTT的流量规模&#xff0c;实现对目标人群的有效覆盖。得年轻消费者得“天下”&#xff0c;年…

tk切换到mac的code分享

文章目录 前言一、基础环境配置二、开发软件与扩展1.用到的开发软件与平替、扩展情况 总结 前言 最近换上了coding人生的第一台mac&#xff0c;以前一直偏好tk&#xff0c;近来身边的朋友越来越多的用mac了&#xff0c;win的自动更新越来越占磁盘了&#xff0c;而且win11抛弃了…

vue elementui v-for 循环el-table-column 第一列数据变到最后一个

这个动态渲染table表格时发现el-table-column 第一列数据变到最后一个 序号被排到后面 代码 修改后 <el-table:data"tableData"tooltip-effect"dark"style"width: 100%"height"500"><template v-for"(item, index) i…

每天一道leetcode:1926. 迷宫中离入口最近的出口(图论中等广度优先遍历)

今日份题目&#xff1a; 给你一个 m x n 的迷宫矩阵 maze &#xff08;下标从 0 开始&#xff09;&#xff0c;矩阵中有空格子&#xff08;用 . 表示&#xff09;和墙&#xff08;用 表示&#xff09;。同时给你迷宫的入口 entrance &#xff0c;用 entrance [entrancerow, …

SpringBoot的配置文件(properties与yml)

文章目录 1. 配置文件的作用2. 配置文件格式3. 配置文件的使用方法3.1. properties配置文件3.1.1. 基本语法和使用3.1.2. properties优缺点分析 3.2. yml配置文件3.2.1. 基本语法与使用3.2.2. yml中单双引号问题3.2.3. yml配置不同类型的数据类型及null3.2.4. 配置对象3.2.5. 配…

android设置竖屏仍然跟随屏幕旋转怎么办

如题所问&#xff0c;我最近遇到一个bug&#xff0c;就是设置了摇感&#xff0c;然后有用户反馈说设置了手机下拉的系统设置-屏幕旋转-关闭。然后屏幕还是会旋转的问题。 首先&#xff0c;我们先从如何设置横竖屏了解下好了 设置横屏和竖屏的方法&#xff1a; 方法一&#x…

uni-app引入sortable列表拖拽,兼容App和H5,拖拽排序。

效果: 拖拽排序 背景&#xff1a; 作为一名前端开发人员&#xff0c;在工作中难免会遇到拖拽功能&#xff0c;分享一个github上一个不错的拖拽js库&#xff0c;能满足我们在项目开发中的需要&#xff0c;下面是我在uniapp中使用SortableJS的使用详细流程&#xff1b; vue开发…

Centos7安装docker后默认开启docker0的网卡|卸载默认网卡

一&#xff1a; 停掉服务 systemctl stop docker [rootwww ~]# systemctl stop docker [rootwww ~]# systemctl status docker ● docker.service - Docker Application Container Engine Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor prese…

【bug】Unity无法创建项目

bug UnityHub无法创建项目 UnityHub无法创建项目 出现的问题&#xff1a;在创建新项目时弹出来一个 无法创建项目 尝试的方法&#xff1a; 刷新许可证 ❌没用退出账号重新登陆 ❌没用重启电脑 ❌没用 最后发现是什么问题呢&#xff1f; 2021.3.3这个版本我之前在资源管理器中…

SpringBoot概述及项目的创建使用

文章目录 一. Spring Boot概述1. 什么是Spring Boot&#xff1f;2. Spring Boot的优点 二. Spring Boot项目的创建1. 使用IDEA创建1.1. 准备工作1.2. 创建运行Spring Boot项目1.3. 进行Web交互1.4. 目录工程介绍1.5. 项目快速添加依赖1.6. 防止配置文件乱码所需的配置1.7. Spri…

Docker实战专栏简介

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【iMessage苹果推?IM推送】群控脚本当Apple APNS推送服务器从您的应用程序接吸收注册消息时,它将为您回到一串devicetoken

推荐内容IMESSGAE相关 作者✈️IMEAE推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容3.日历推 *** …