Lodash 是一个流行的 JavaScript 工具库,提供了许多简化开发的实用函数。其中之一是 filter
函数,它可以帮助我们从一个数组或对象集合中筛选出符合条件的元素。但当遇到嵌套对象时,可能会出现一些困难。本文将介绍如何使用 Lodash 的 filter
函数在嵌套对象中进行过滤。
前置知识
在阅读本文之前,你需要了解以下概念:
- JavaScript 对象和数组
- Lodash 库及其基本用法
- 箭头函数、对象解构和扩展运算符等 ES6+ 特性
案例说明
假设我们有一个包含用户信息的对象数组,每个对象包含以下属性:
-- -------------------- ---- ------- ----- ----- - - - --- -- ----- -------- ------ --------- -------- -------- - ----- ---- ------ ------ ----- ---- ------- - -- - --- -- ----- ------ ------ --------- -------- - ----- ---- --------- ------ ----- ---- ------- - -- - --- -- ----- ---------- ------ --------- -------- - ----- ---------- ------ ----- ---- ------- - -- --
我们想要筛选出居住在纽约州(state: 'NY')且身份为管理员(roles 包含 'admin')的用户。如何使用 Lodash 的 filter
函数来实现这个过滤条件呢?
过滤嵌套对象
Lodash 的 filter
函数可以接受一个数组或对象集合,并返回符合条件的元素。我们可以使用箭头函数在回调函数中指定过滤条件。例如,要筛选出所有名字为 'Alice' 的用户,可以这样写:
const filteredUsers = _.filter(users, user => user.name === 'Alice');
但是,当需要从嵌套对象中进行过滤时,如何访问子属性呢?Lodash 提供了多个辅助函数来解决这个问题。
_.get
_.get
函数可以帮助我们安全地访问嵌套属性。它接受两个参数:第一个参数是要访问的对象,第二个参数是属性路径,可以用点号或数组形式表示。如果属性不存在,则返回 undefined。
例如,要获取第一个用户的地址城市名称,可以这样写:
const city = _.get(users[0], 'address.city');
如果要遍历所有用户并获取其地址城市名称,可以使用 map
和 get
函数组合起来实现:
const cities = users.map(user => _.get(user, 'address.city'));
_.matches
_.matches
函数可以帮助我们创建一个断言函数,用于匹配对象是否符合指定的属性和值。它接受一个参数,即一个对象,其中每个属性都是要匹配的属性名称,对应的属性值为要匹配的值。返回的函数可以用作 filter
函数的回调函数。
例如,要筛选出所有状态为 'NY' 的用户,可以这样写:
const filteredUsers = _.filter(users, _.matches({ 'address.state': 'NY' }));
_.overEvery 和 _.overSome
_.overEvery
函数可以帮助我们将多个断言函数组合成一个新函数,只有当所有断言函数都返回 true 时,整个函数才会返回 true。
_.overSome
函数与之相反,只要任何一个断言函数返回 true,整个函数就会返回 true。
例如
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/14551