Lodash方法總結

目錄

1. _.defaults()為對象填充默認值

基本語法

功能說明

示例代碼

注意事項

與其他類似方法的區別

2. _.pickBy()刪除對象中值為空串或?null?的屬性

實現方法

代碼說明

擴展:深層過濾

3._.omitBy()移除滿足條件的屬性

基本語法

核心功能

示例代碼

1. 基礎用法(移除 falsy 值)

2. 自定義判斷函數(移除特定類型)

3. 基于屬性名的篩選

注意事項

適用場景


1. _.defaults()為對象填充默認值

用于為對象填充默認值。它會將源對象的屬性復制到目標對象中,但僅當目標對象中不存在這些屬性時才會進行復制。

基本語法

javascript

_.defaults(target, [source1], [source2], ...)
  • target:目標對象,將被填充默認值
  • [source]:一個或多個源對象,提供默認值

功能說明

  1. 該函數會遍歷所有源對象的屬性
  2. 對于每個屬性,只有當目標對象中不存在該屬性時,才會從源對象復制到目標對象
  3. 如果有多個源對象,后面的源對象不會覆蓋前面源對象已經設置的屬性
  4. 返回填充后的目標對象(與傳入的目標對象是同一個引用)

示例代碼

javascript

const _ = require('lodash');// 目標對象
const user = {name: 'John'
};// 源對象 - 提供默認值
const defaults1 = {age: 30,city: 'New York'
};const defaults2 = {age: 25,country: 'USA'
};// 應用默認值
_.defaults(user, defaults1, defaults2);console.log(user);
// 輸出: { name: 'John', age: 30, city: 'New York', country: 'USA' }

在這個例子中:

  • user?對象已有?name?屬性,所以不會被覆蓋
  • age?屬性從第一個源對象?defaults1?獲取,第二個源對象?defaults2?的?age?不會覆蓋它
  • city?和?country?從相應的源對象獲取,因為目標對象中原本沒有這些屬性

注意事項

  1. _.defaults?是淺拷貝,只會復制對象的頂層屬性
  2. 如果屬性值是對象,不會進行深層合并,而是直接替換(如果目標對象中沒有該屬性)
  3. 與?_.assign?不同,_.defaults?不會覆蓋目標對象已有的屬性

與其他類似方法的區別

  • _.defaults:源對象屬性僅在目標對象沒有該屬性時才會被復制
  • _.assign:源對象屬性會覆蓋目標對象的同名屬性
  • _.merge:會進行深層合并,而不僅僅是淺拷貝

這個方法在需要為配置對象提供默認值的場景中非常有用,確保某些必要屬性始終存在。

2. _.pickBy()刪除對象中值為空串或?null?的屬性

常用的實現方式是使用?_.pickBy()?方法配合自定義判斷函數。

實現方法

_.pickBy()?方法會創建一個新對象,只包含原對象中通過判斷函數的屬性。我們可以利用這一點過濾掉值為空串或?null?的屬性。

示例代碼:

javascript

const _ = require('lodash');// 原始對象
const obj = {name: "Alice",age: null,address: "",email: "alice@example.com",phone: ""
};// 刪除值為 null 或空串的屬性
const filteredObj = _.pickBy(obj, (value) => {// 保留值既不是 null 也不是空串的屬性return value !== null && value !== "";
});console.log(filteredObj);
// 輸出: { name: "Alice", email: "alice@example.com" }

代碼說明

  • _.pickBy(obj, predicate)?接收兩個參數:原對象和判斷函數
  • 判斷函數?(value) => value !== null && value !== ""?會檢查每個屬性值:
    • 當值不是?null?且不是空串時,返回?true(保留該屬性)
    • 否則返回?false(過濾掉該屬性)
  • 該方法會返回一個新對象,不會修改原對象

擴展:深層過濾

如果需要處理嵌套對象,可以結合?_.transform()?實現深層過濾:

javascript

function deepFilter(obj) {return _.transform(obj, (result, value, key) => {// 如果是對象且不是 null,遞歸處理if (_.isObject(value) && value !== null) {const filtered = deepFilter(value);if (!_.isEmpty(filtered)) {result[key] = filtered;}} // 過濾掉 null 和空串else if (value !== null && value !== "") {result[key] = value;}});
}// 測試嵌套對象
const nestedObj = {a: null,b: "",c: {d: "",e: null,f: "hello"}
};console.log(deepFilter(nestedObj)); 
// 輸出: { c: { f: "hello" } }

這種方式可以靈活處理各種復雜對象結構,滿足不同場景的需求。

3._.omitBy()移除滿足條件的屬性

與_.pickBy()的篩選邏輯恰好相反,

基本語法

javascript

運行

_.omitBy(object, [predicate=_.identity])
  • 參數
    • object:需要處理的源對象
    • predicate(可選):判斷函數,默認使用?_.identity(直接判斷值是否為真)
  • 返回值:一個新對象,包含所有不滿足判斷函數的屬性

核心功能

_.omitBy()?會遍歷對象的所有可枚舉屬性,對每個屬性執行判斷函數:

  • 若判斷函數返回?true:該屬性會被移除
  • 若判斷函數返回?false:該屬性會被保留到新對象中

示例代碼

1. 基礎用法(移除 falsy 值)

javascript

運行

const _ = require('lodash');const obj = {a: 1,b: null,c: '',d: 0,e: undefined,f: 'hello'
};// 移除所有 falsy 值(null、''、0、undefined 等)
const result = _.omitBy(obj, _.isFalsy);console.log(result);
// 輸出: { a: 1, f: 'hello' }
2. 自定義判斷函數(移除特定類型)

javascript

運行

const data = {name: 'Alice',age: 30,hobbies: ['reading', 'coding'],address: null,isStudent: false
};// 移除數組和布爾值類型的屬性
const filtered = _.omitBy(data, (value) => {return _.isArray(value) || _.isBoolean(value);
});console.log(filtered);
// 輸出: { name: 'Alice', age: 30, address: null }
3. 基于屬性名的篩選

javascript

運行

const config = {apiUrl: 'https://api.example.com',timeout: 5000,debug: true,_internalKey: 'secret'
};// 移除以下劃線開頭的屬性
const publicConfig = _.omitBy(config, (value, key) => {return key.startsWith('_');
});console.log(publicConfig);
// 輸出: { apiUrl: 'https://api.example.com', timeout: 5000, debug: true }

注意事項

  1. 不修改原對象_.omitBy()?始終返回新對象,源對象保持不變
  2. 淺處理:只操作對象的頂層屬性,不會遞歸處理嵌套對象
  3. 判斷函數參數:回調函數接收?(value, key)?兩個參數,可同時基于值和鍵進行判斷
  4. 與?_.pickBy()?的關系:兩者是反向操作,_.omitBy(obj, fn)?等價于?_.pickBy(obj, (v,k) => !fn(v,k))

適用場景

  • 清理對象中的無效數據(如 null、空串)
  • 移除敏感信息或內部屬性
  • 過濾不符合特定條件的屬性
  • 數據格式化和預處理

通過靈活定義判斷函數,_.omitBy()?可以滿足各種對象屬性篩選需求,是數據處理中非常實用的工具。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96428.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96428.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96428.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#---Expression(表達式)

前言:Expression 是C# 高級編程,表達式的應用場景有 ORM框架:Entity Framework,Dapper等,規則引擎:動態業務規則評估, 依賴注入:高級DI容器實現,測試框架:模擬…

Lodash-es 完整開發指南:ES模塊化JavaScript工具庫實戰教程

簡介 Lodash-es 是 Lodash 庫的 ES 模塊版本,提供了大量實用的 JavaScript 工具函數。它支持按需導入,可以顯著減少打包體積,是現代 JavaScript 項目中的首選工具庫。 主要特性 ES 模塊支持: 完全支持 ES6 模塊語法按需導入: 只導入需要的…

26. AI-Agent-Dify

文章目錄前言一、Dify入門為什么使用 Dify?Dify 能做什么?二、Dify私有化部署Docker Compose 部署前提條件克隆 Dify 代碼啟動 Dify更新 Dify訪問 Dify自定義配置三、Dify構建企業級Agent應用定義如何使用智能助手添加助手需要的工具配置 Agent配置對話開…

云原生:微服務與Serverless指南

Copilot時代的開發者效能提升 代碼生成與補全:減少重復性編碼工作,加快開發速度錯誤檢測與修復:實時提示潛在問題,降低調試時間知識獲取與學習:幫助開發者快速掌握新語言或框架協作效率:通過AI輔助減少團隊…

SpringBoot + Apache Tika:一站式解決文件數據提取難題

在日常開發中,你是否也遇到過這樣的窘境:領導甩來需求“把用戶上傳的 Word、Excel、PDF 里的關鍵信息扒出來存庫”,你卻要對著不同格式逐個攻堅——解析 Word 用 POI 還要處理 .doc/.docx 兼容,解析 Excel 要啃合并單元格、公式計…

車牌模擬生成器:Python3.8+Opencv代碼實現與商業應用前景(C#、python 開發包SDK)

車牌模擬生成器:Python代碼實現與商業應用前景引言在智慧城市建設和汽車行業數字化浪潮中,車牌作為車輛的唯一標識,其相關技術應用正變得越來越重要。今天我們將介紹一個基于Python的車牌模擬生成器,探討其技術實現、功能特點以及…

小程序非主頁面的數據動作關聯主頁面的數據刷新操作

如果在主頁面跳轉到其他頁面。比如說我的收藏頁面,然后有取消收藏的動作,當返回到主頁面的時候,如果有關聯數據顯示在主頁面,刷新頁面對應的狀態。 下面的代碼是實現://卡片收藏/取消if (newCollectd) {this.setData({…

后端(fastAPI)學習筆記(CLASS 1):擴展基礎

一、python的類型聲明1、類型聲明的背景和作用python 3.6 版本引入了“類型提示”1、類型提示是一種新的語法,用來聲明變量的類型2、提高編譯器和工具的支持能力為什么要學習類型提示1、了解類型提示不僅僅對使用FastAPI有幫助,也能提高代碼的可讀性度和…

2023年系統分析師上半年論文試題分析

試題一 論信息系統的可行性分析信息系統可行性分析的目的是確認在當前條件下企業是否有必要建設新系統,以及建設新系統的工作是否具備必要的條件。如何進行可行性分析是系統分析師所必須面臨的問題。請圍繞信息系統可行性分析論題,依次從以下三個方面進行…

洛谷 P1967 [NOIP 2013 提高組] 貨車運輸(kruskal 重構樹 + 求路徑最小邊權)

題目鏈接 題目難度 洛谷上是藍題&#xff0c;本人認為評高了&#xff0c;此題思維和實現都不難&#xff0c;應該是綠題。 題目解法概括 kruskal 重構樹 倍增優化求路徑最小邊權 代碼 #include <iostream> #include <cstdio> #include <vector> #inclu…

【01】針對開源收銀系統icepos (寶塔面板) 詳細安裝教程詳細參考-優雅草卓伊凡

【01】針對開源收銀系統icepos (寶塔面板) 詳細安裝教程詳細參考-優雅草卓伊凡引言本文做參考&#xff0c;下篇文章 直接實踐&#xff0c;由于已經選型本系統是服務端php開發的系統&#xff0c;他的系統環境如下&#xff1a;系統安裝 環境要求ICEPOS對服務器或電腦硬件要求不高…

MySQL的常用命令

目錄1. 連接MySQL數據庫基本連接語法連接參數說明2. 數據庫操作2.1 查看數據庫2.2 創建數據庫2.3 刪除數據庫3. 表操作3.1 查看表信息3.2 創建表3.3 常用數據類型3.4 修改表結構3.5 刪除表4. 數據操作 (CRUD)4.1 插入數據 (CREATE)4.2 查詢數據 (READ)基本查詢條件查詢排序和分…

Linux: config: CONFIG_CHECKPOINT_RESTORE;CRIU

文章目錄 config CHECKPOINT_RESTORE commit related 簡介 參考 如何使用 Checkpoint/Restore 功能 步驟 1:確保內核支持 步驟 2:安裝 CRIU 步驟 3:檢查點(Checkpoint) 步驟 4:恢復(Restore) 步驟 5:驗證 常見應用場景 注意事項 python config CHECKPOINT_RESTORE bo…

eclipse怎么把項目設為web

在 Eclipse 中將一個項目設置為 Web 項目&#xff08;或稱動態 Web 項目&#xff09;主要有兩種場景&#xff1a;?創建新的 Web 項目? 和 ?將現有項目轉換為 Web 項目。我將為你詳細講解這兩種方法。前提條件&#xff1a;確保你有必要的 Eclipse 組件在開始之前&#xff0c;…

CVPR 2025|基于視覺語言模型的零樣本3D視覺定位

論文信息題目&#xff1a;Zero-Shot 3D Visual Grounding from Vision-Language Models基于視覺語言模型的零樣本3D視覺定位作者&#xff1a;Rong Li, Shijie Li, Lingdong Kong, Xulei Yang, Junwei Liang論文創新點提出全新框架&#xff1a;論文提出SeeGround這一無需訓練的零…

Realtime API 語音代理端到端接入全流程教程(含 Demo,延遲 280ms)

在現代應用中&#xff0c;實時語音交互已經成為重要功能&#xff0c;而低延遲的語音傳輸更是用戶體驗的關鍵指標。本文將詳細介紹如何使用 Realtime API 實現 語音代理 的端到端接入&#xff0c;包括環境搭建、接口調用、低延遲優化及 Demo 演示。通過本教程&#xff0c;開發者…

AI賦能辦公:用Python解決發票合并打印難題

一、問題的提出今天網友提問&#xff1a;報銷時&#xff0c;財務要求要把發票合并打印&#xff0c;即兩張合成一張放在A4紙上&#xff0c;中間還要加一道黑色分界線&#xff0c;如何快速完成數十張發票的打印&#xff1f;問題的提出二、問題分析這個問題可以采用兩種方法解決&a…

Shell編程之正則表達式與文本處理工具

一、正則表達式基礎1. 正則表達式概述?定義?&#xff1a;正則表達式&#xff08;Regular Expression&#xff0c;簡稱Regex&#xff09;是由普通字符?&#xff08;如字母、數字、標點符號&#xff09;與元字符?&#xff08;具有特殊含義的專用字符&#xff09;組成的字符串…

使用 Spring AI Alibaba Graph 實現工作流

1 依賴<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.0.0.2</version> </dependency><dependency><groupId>com.alibaba.cloud.…

碰一碰系統源碼于小程序打通技術開發整合方案,驅動AI技術開發源代碼

碰一碰系統結合小程序開發數據互通&#xff0c;驅動AI技術開發源代碼碰一碰系統作為門店獲客技術落地的核心載體&#xff0c;已從標準化產品向實體店定制演進。本文從源碼d的形式出發&#xff0c;解析企業級數字人分身系統的交互系統&#xff0c;為技術團隊提供可落地的開發指南…