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.pswp.cn/news/39910.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/39910.shtml
英文地址,請注明出處:http://en.pswp.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…

PostCSS在vue中的使用

1、安裝 PostCSS 和所需的插件。在命令行中運行以下命令&#xff1a; npm install postcss autoprefixer cssnano postcss-pxtorem --save-dev 這將安裝 PostCSS、Autoprefixer、CSSnano 和 postcss-pxtorem 插件&#xff0c;同時將它們添加到項目的開發依賴中。 2、在項目根目…

每天一道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…

神經網絡基礎-神經網絡補充概念-27-深層網絡中的前向傳播

概念 深層神經網絡中的前向傳播是指從輸入數據開始&#xff0c;逐層計算每個神經元的輸出值&#xff0c;直到得到最終的預測值。 一般步驟 1輸入數據傳遞&#xff1a; 將輸入數據傳遞給網絡的輸入層。輸入數據通常是一個特征矩陣&#xff0c;每一列代表一個樣本&#xff0c;…

【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…