lodash对象属性筛选:pick、omit与pickBy使用技巧
在JavaScript开发中,处理对象数据时经常需要筛选属性。Lodash提供了三个实用函数来解决这个问题:pick、omit和pickBy。本文将详细介绍这三个函数的使用方法和适用场景,帮助你高效处理对象属性筛选需求。
1. pick:精准选择需要的属性
pick函数允许你从对象中选择指定的属性,返回一个只包含这些属性的新对象。这在需要提取对象部分属性时非常有用。
基本用法
const object = { 'a': 1, 'b': '2', 'c': 3 };
pick(object, ['a', 'c']);
// => { 'a': 1, 'c': 3 }
支持多种参数形式
pick函数的第二个参数可以是多个字符串参数,也可以是字符串数组,甚至可以混合使用:
const object = { a: 1, b: 2, c: 3, d: 4 };
// 多个字符串参数
pick(object, 'a', 'c');
// => { a: 1, c: 3 }
// 字符串数组
pick(object, ['a', 'd'], 'c');
// => { b: 2 }
支持深层路径选择
pick还支持通过点分隔的字符串或数组形式选择深层嵌套的属性:
const nested = { a: 1, b: { c: 2, d: 3 } };
pick(nested, 'b.c');
// => { b: { c: 2 } }
const object = { 'a.b': 1, a: { b: 2 } };
pick(object, [['a.b']]);
// => { 'a.b': 1 }
源码位置:src/pick.ts
2. omit:排除不需要的属性
omit函数与pick相反,它从对象中排除指定的属性,返回一个不包含这些属性的新对象。当你需要移除少量属性而保留大部分属性时,omit比pick更方便。
基本用法
const object = { a: 1, b: 2, c: 3, d: 4 };
omit(object, 'a', 'c');
// => { b: 2, d: 4 }
排除深层属性
omit同样支持通过点分隔的路径排除深层嵌套的属性:
const nested = { a: 1, b: { c: 2, d: 3 } };
omit(nested, 'b.c');
// => { a: 1, b: { d: 3 } }
处理特殊情况
omit函数在处理null/undefined值或原始类型时表现稳定,返回空对象或仅包含自身属性的对象:
// 处理null/undefined
omit(null, 'a'); // => {}
omit(undefined, 'a'); // => {}
// 处理原始类型
omit('', 'b'); // => { a: 1 } (假设String原型上有a属性)
测试用例:test/omit.spec.js
3. pickBy:按条件筛选属性
pickBy函数允许你通过一个 predicate(断言)函数来筛选对象属性,返回所有使断言函数返回真值的属性组成的新对象。当你需要根据属性值或属性名的特征来筛选时,pickBy非常有用。
基本用法
const object = { 'a': 1, 'b': '2', 'c': 3 };
pickBy(object, isNumber);
// => { 'a': 1, 'c': 3 }
自定义断言函数
你可以根据需要编写自定义的断言函数,断言函数接收两个参数:属性值和属性名:
const object = { a: 1, b: 2, c: 3, d: 4 };
// 选择值为奇数的属性
const actual = pickBy(object, (n) => n % 2 === 1);
// => { a: 1, c: 3 }
注意事项
pickBy不会将点分隔的键视为深层路径,而是作为单个键处理:
const object = { 'a.b.c': 1 };
pickBy(object, () => true);
// => { 'a.b.c': 1 }
源码位置:src/pickBy.ts 测试用例:test/pickBy.spec.js
4. 函数对比与适用场景
| 函数 | 作用 | 适用场景 | 特点 |
|---|---|---|---|
pick | 选择指定属性 | 已知需要保留的属性名 | 简单直观,适合少量属性选择 |
omit | 排除指定属性 | 已知需要排除的属性名 | 适合排除少量属性,保留大部分 |
pickBy | 按条件筛选 | 需要根据值或键的特征筛选 | 灵活性高,适合复杂筛选逻辑 |
使用流程图
5. 实际应用示例
数据处理场景
假设你从API获取了用户数据,但只需要其中的部分信息显示在界面上:
// API返回的用户数据
const user = {
id: 1,
name: 'John Doe',
email: 'john@example.com',
password: 'hashed_password',
age: 30,
address: {
street: '123 Main St',
city: 'Anytown',
country: 'USA'
}
};
// 1. 使用pick选择需要显示的基本信息
const userInfo = pick(user, ['name', 'email', 'age']);
// => { name: 'John Doe', email: 'john@example.com', age: 30 }
// 2. 使用omit排除敏感信息
const safeUser = omit(user, ['password']);
// => { id: 1, name: 'John Doe', email: 'john@example.com', age: 30, address: {...} }
// 3. 使用pickBy选择数值类型的属性
const numericInfo = pickBy(user, (value) => typeof value === 'number');
// => { id: 1, age: 30 }
表单处理场景
在处理表单数据时,经常需要过滤掉空值或无效值:
// 表单提交的数据
const formData = {
username: 'johndoe',
email: 'john@example.com',
phone: '',
age: 0,
address: null,
hobbies: ['reading', 'coding']
};
// 过滤掉空值和无效值
const validData = pickBy(formData, (value) => {
if (value === null || value === undefined) return false;
if (typeof value === 'string' && value.trim() === '') return false;
return true;
});
// => { username: 'johndoe', email: 'john@example.com', age: 0, hobbies: ['reading', 'coding'] }
6. 总结
Lodash的pick、omit和pickBy函数为对象属性筛选提供了灵活高效的解决方案。根据具体需求选择合适的函数,可以大幅简化代码,提高开发效率:
- 当你明确知道需要保留哪些属性时,使用
pick - 当你需要排除少量属性而保留大部分时,使用
omit - 当你需要根据属性值或键的特征进行筛选时,使用
pickBy
这些函数都是纯函数,不会修改原始对象,返回新的对象,符合函数式编程的理念,有助于编写更可预测和易于维护的代码。
希望本文能帮助你更好地理解和应用这些实用的Lodash函数。如果你想深入了解更多Lodash的实用功能,可以查阅项目的README.md和源代码。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



