目錄
1. _.defaults()為對象填充默認值
基本語法
功能說明
示例代碼
注意事項
與其他類似方法的區別
2. _.pickBy()刪除對象中值為空串或?null?的屬性
實現方法
代碼說明
擴展:深層過濾
3._.omitBy()移除滿足條件的屬性
基本語法
核心功能
示例代碼
1. 基礎用法(移除 falsy 值)
2. 自定義判斷函數(移除特定類型)
3. 基于屬性名的篩選
注意事項
適用場景
1. _.defaults()為對象填充默認值
用于為對象填充默認值。它會將源對象的屬性復制到目標對象中,但僅當目標對象中不存在這些屬性時才會進行復制。
基本語法
javascript
_.defaults(target, [source1], [source2], ...)
target
:目標對象,將被填充默認值[source]
:一個或多個源對象,提供默認值
功能說明
- 該函數會遍歷所有源對象的屬性
- 對于每個屬性,只有當目標對象中不存在該屬性時,才會從源對象復制到目標對象
- 如果有多個源對象,后面的源對象不會覆蓋前面源對象已經設置的屬性
- 返回填充后的目標對象(與傳入的目標對象是同一個引用)
示例代碼
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
?從相應的源對象獲取,因為目標對象中原本沒有這些屬性
注意事項
_.defaults
?是淺拷貝,只會復制對象的頂層屬性- 如果屬性值是對象,不會進行深層合并,而是直接替換(如果目標對象中沒有該屬性)
- 與?
_.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 }
注意事項
- 不修改原對象:
_.omitBy()
?始終返回新對象,源對象保持不變 - 淺處理:只操作對象的頂層屬性,不會遞歸處理嵌套對象
- 判斷函數參數:回調函數接收?
(value, key)
?兩個參數,可同時基于值和鍵進行判斷 - 與?
_.pickBy()
?的關系:兩者是反向操作,_.omitBy(obj, fn)
?等價于?_.pickBy(obj, (v,k) => !fn(v,k))
適用場景
- 清理對象中的無效數據(如 null、空串)
- 移除敏感信息或內部屬性
- 過濾不符合特定條件的屬性
- 數據格式化和預處理
通過靈活定義判斷函數,_.omitBy()
?可以滿足各種對象屬性篩選需求,是數據處理中非常實用的工具。