在JavaScript中使用filter()的4个实用案例

英文 | https://medium.com/javascript-in-plain-english/4-practical-use-cases-of-using-filter-in-javascript-db46e2ec83b2

翻译 | web前端开发(ID:web_qdkf)

创建一个包含给定数组元素子集的新数组是JavaScript中最常见的任务之一。

除了使用循环语句,我们还可以使用filter(),它是一种更短,更简洁的方式。

1、删除重复的值

这个有点棘手。我们将利用indexOf()功能。它是一个内置函数,该函数可以返回数组中给定元素的第一个索引。

我们可以使用它来形成一个条件,以删除数组中的重复值,如下所示。

const numbers = [3, 12, 54, 12, 4, 4, 3, 12, 16];const filteredNumbers = numbers.filter((number, index) => numbers.indexOf(number) === index);console.log(filteredNumbers); // [3, 12, 54, 4, 16]

我们使用回调函数的第二个参数,它是当前元素的索引。

在这里,我们将indexOf()函数返回的索引与当前元素的实际索引进行比较。如果它们不同,则当前元素为重复值。

以上面的代码段中的数组为例。当实际索引为时3,相邻元素的值为12。但是,如果我们使用indexOf()该元素,则返回的索引是1因为该元素12首次出现在index处1。因此12是重复值之一。

2、删除无效值

无效值被认为是可能导致错误和意外行为的值。

以年龄为例。如果年龄是定义的数字,则该年龄有效。

现在,我们要求过滤所有有效年龄的人,请看下面的代码。

const people = [  { name: ‘Amy’, gender: ‘female’, age: ‘28’ },  { name: ‘James’, gender: ‘male’, age: 13 },  { name: ‘Victor’, gender: ‘male’, age: null },  { name: ‘David’, gender: ‘male’, age: 28 },  { name: ‘Simon’, gender: ‘male’, age: undefined },  { name: ‘Anna’, gender: ‘female’, age: 21 },  { name: ‘Jane’, gender: ‘female’, age: NaN }];const filteredPeople = people.filter(person => person.age !== undefined && typeof person.age === ‘number’ && !isNaN(person.age));console.log(filteredPeople); // [{ name: ‘James’, gender: ‘male’, age: 13 }, { name: ‘David’, gender: ‘male’, age: 28 }, { name: ‘Anna’, gender: ‘female’, age: 21 }]

3、过滤数字数组

这是最简单的用法。

假设你有一个数字数组,并且只需要从该数组中提取奇数。

const numbers = [23, 54, 1, 3, 72, 28];const oddNumbers = numbers.filter(number => number % 2 !== 0);console.log(oddNumbers); // [23, 1, 3]

或者你想创建一个包含给定数组中所有素数的新数组。

const isPrime = number => {  if (number === 1) return false;  if (number === 2) return true;  for (let i = 2; i < number; i++) {    if (number % i === 0) return false;  }
  return true;}const numbers = [23, 54, 1, 3, 72, 28];const oddNumbers = numbers.filter(isPrime);console.log(oddNumbers); // [23, 3]

4、过滤对象数组

尽管一个对象比数字更复杂,但是使用filter()仍然可以保持简单。

例如,假设我们有很多人。要求是找到所有年龄大于18岁的人。

const people = [  { name: ‘Amy’, gender: ‘female’, age: 28 },  { name: ‘James’, gender: ‘male’, age: 13 },  { name: ‘Victor’, gender: ‘male’, age: 17 },  { name: ‘David’, gender: ‘male’, age: 28 },  { name: ‘Simon’, gender: ‘male’, age: 33 }];const filteredPeople = people.filter(person => person.age > 18);console.log(filteredPeople); // [{ name: ‘Amy’, gender: ‘female’, age: 28 }, { name: ‘David’, gender: ‘male’, age: 28 }, { name: ‘Simon’, gender: ‘male’, age: 33 }]

如果是,我们需要找出所有年龄大于18岁的女性,这时,我们只需向回调函数添加一个附加条件即可。

const people = [  { name: ‘Amy’, gender: ‘female’, age: 28 },  { name: ‘James’, gender: ‘male’, age: 13 },  { name: ‘Victor’, gender: ‘male’, age: 17 },  { name: ‘David’, gender: ‘male’, age: 28 },  { name: ‘Simon’, gender: ‘male’, age: 33 }];const filteredPeople = people.filter(person => person.age > 18 && person.gender === ‘female’);console.log(filteredPeople); // [{ name: ‘Amy’, gender: ‘female’, age: 28 }]

是不是很容易?

结论

以上就是一些关于在JS中使用filter()的4个实例。如果你还知道其他用例吗?请在下面的评论留言区里告诉我们。

感谢阅读。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值