• JS中filter的用法


     简介

    filter()方法会创建一个新数组,原数组的每个元素传入回调函数中,回调函数中有return返回值,若返回值为true,这个元素保存到新数组中;若返回值为false,则该元素不保存到新数组中;原数组不发生改变。

    语法

      array.filter(function(currentValue,index,arr), thisValue)

      

     例子

      例如,在一个Array中,删掉偶数,只保留奇数,可以这么写:

    1 var arr = [1, 2, 4, 5, 6, 9, 10, 15];
    2 var r = arr.filter(function (x) {
    3     return x % 2 !== 0;
    4 });
    5 r; // [1, 5, 9, 15]

    把一个Array中的空字符串删掉,可以这么写:

    1 var arr = ['A', '', 'B', null, undefined, 'C', '  '];
    2 var r = arr.filter(function (s) {
    3     return s && s.trim(); // 注意:IE9以下的版本没有trim()方法
    4 });
    5 r; // ['A', 'B', 'C']

    可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。

    filter()接收的回调函数,其实可以有多个参数。通常我们仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身:

    复制代码
    复制代码
    1 var arr = ['A', 'B', 'C'];
    2 var r = arr.filter(function (element, index, self) {
    3     console.log(element); // 依次打印'A', 'B', 'C'
    4     console.log(index); // 依次打印0, 1, 2
    5     console.log(self); // self就是变量arr
    6     return true;
    7 });
    复制代码
    复制代码

    利用filter,可以巧妙地去除Array的重复元素:

    复制代码
    复制代码
    1 'use strict';
    2 
    3 var
    4     r,
    5     arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
    6   r = arr.filter(function (element, index, self) {
    7      return self.indexOf(element) === index;
    8   });
    9 console.log(r.toString());
    复制代码
    复制代码

    运行结果:

    apple,strawberry,banana,pear,orange

    去除重复元素依靠的是indexOf总是返回第一个元素的位置,后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了。

    尝试用filter()筛选出素数:

    复制代码
    复制代码
     1 'use strict';
     2 
     3 function get_primes(arr) {
     4     var i;
     5     return arr.filter(function (element) {  
     6             var flag=true;  
     7             if(element<2){  
     8             flag=false;  
     9         }else {  
    10             for(var i=2;i<element;i++){  
    11                 if (element%i==0){  
    12                     flag=false;  
    13                     break;  
    14                 }  
    15             }  
    16         }  
    17         return flag;  
    18     });
    19 }
    20 
    21 // 测试:
    22 var
    23     x,
    24     r,
    25     arr = [];
    26 for (x = 1; x < 100; x++) {
    27     arr.push(x);
    28 }
    29 r = get_primes(arr);
    30 if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
    31     console.log('测试通过!');
    32 } else {
    33     console.log('测试失败: ' + r.toString());
    34 }
    复制代码
    复制代码

    运行结果:

    测试通过!

    参考:https://www.liaoxuefeng.com/wiki/1022910821149312/1024327002617536

  • 相关阅读:
    【Anagrams】 cpp
    【Count and Say】cpp
    【Roman To Integer】cpp
    【Integer To Roman】cpp
    【Valid Number】cpp
    重构之 实体与引用 逻辑实体 逻辑存在的形式 可引用逻辑实体 不可引用逻辑实体 散弹式修改
    Maven项目聚合 jar包锁定 依赖传递 私服
    Oracle学习2 视图 索引 sql编程 游标 存储过程 存储函数 触发器
    mysql案例~tcpdump的使用
    tidb架构~本地化安装
  • 原文地址:https://www.cnblogs.com/hlyin/p/13560510.html
Copyright © 2020-2023  润新知