目录
[1. _.defaults()为对象填充默认值](#1. _.defaults()为对象填充默认值)
[2. _.pickBy()删除对象中值为空串或 null 的属性](#2. _.pickBy()删除对象中值为空串或 null 的属性)
[1. 基础用法(移除 falsy 值)](#1. 基础用法(移除 falsy 值))
[2. 自定义判断函数(移除特定类型)](#2. 自定义判断函数(移除特定类型))
[3. 基于属性名的筛选](#3. 基于属性名的筛选)
- _.defaults()为对象填充默认值
用于为对象填充默认值。它会将源对象的属性复制到目标对象中,但仅当目标对象中不存在这些属性时才会进行复制。
基本语法
javascript
javascript
_.defaults(target, [source1], [source2], ...)
target
:目标对象,将被填充默认值[source]
:一个或多个源对象,提供默认值
功能说明
- 该函数会遍历所有源对象的属性
- 对于每个属性,只有当目标对象中不存在该属性时,才会从源对象复制到目标对象
- 如果有多个源对象,后面的源对象不会覆盖前面源对象已经设置的属性
- 返回填充后的目标对象(与传入的目标对象是同一个引用)
示例代码
javascript
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
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
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
运行
javascript
_.omitBy(object, [predicate=_.identity])
- 参数 :
object
:需要处理的源对象predicate
(可选):判断函数,默认使用_.identity
(直接判断值是否为真)
- 返回值:一个新对象,包含所有不满足判断函数的属性
核心功能
_.omitBy()
会遍历对象的所有可枚举属性,对每个属性执行判断函数:
- 若判断函数返回
true
:该属性会被移除 - 若判断函数返回
false
:该属性会被保留到新对象中
示例代码
1. 基础用法(移除 falsy 值)
javascript
运行
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
运行
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
运行
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()
可以满足各种对象属性筛选需求,是数据处理中非常实用的工具。