zoukankan      html  css  js  c++  java
  • JS 数组高阶函数 map、reduce、filter、sort等

    JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。

    一个最简单的高阶函数:

    function add(x, y, f) {
        return f(x) + f(y);
    }

    Map

    定义和用法:

    map() 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。

    map() 方法按照原始数组元素顺序依次处理元素。map()作为高阶函数,事实上它把运算规则抽象了。

    arr.map(function(currentValue,index,arr),thisValue) 

    参数:

    currentValue 必须 当前元素值 

    index 可选 当前元素的索引值 

    arr 可选 当前元素属于的数组对象。 

    thisvalue 可选 对象作为该执行回调时使用,传递给函数,用作 "this" 的值。

    实例:

    function pow(x) {
        return x * x;
    }
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]

    reduce

    reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值

    语法:

    array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
    total 必需。初始值, 或者计算结束后的返回值。

    Array的reduce()把一个函数作用在这个Array[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是:

    [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)

    比方说对一个Array求和,就可以用reduce实现:

    var arr = [1, 3, 5, 7, 9];
    arr.reduce(function (x, y) {
        return x + y;
    }); // 25
    //第一步x=1 y=3 第二步 x=4 y=5 第三步 x=9 y=7 ……

    要把[1, 3, 5, 7, 9]变换成整数13579,reduce()也能派上用场:

    var arr = [1, 3, 5, 7, 9];
    arr.reduce(function (x, y) {
        return x * 10 + y;
    }); // 13579

    练习:

    一个字符串“13579"先变成Array——[1, 3, 5, 7, 9],再利用reduce()就可以写出一个把字符串转换为Number的函数。

    不要使用JavaScript内置的parseInt()函数,利用map和reduce操作实现一个string2int()函数:

    function string2int(s) {
        let arr = s.split('')    
        arr=arr.map(x=>{
                return x*1
        });
        return arr.reduce((x,y)=>{
               return x*10+y
        })
    }

    filter

    filter也是一个常用的操作,它用于Array的某些元素过滤掉,然后返回剩下的元素

    map()类似,Arrayfilter()也接收一个函数。map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。

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

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

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

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

    sort

    无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素xy,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

    var arr = [10, 20, 1, 2];
    arr.sort(function (x, y) {
        if (x < y) {
            return -1;
        }
        if (x > y) {
            return 1;
        }
        return 0;
    });
    console.log(arr); // [1, 2, 10, 20]
    • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
    • 若 a 等于 b,则返回 0。
    • 若 a 大于 b,则返回一个大于 0 的值。

    注:sort()方法会直接对Array进行修改,它返回的结果仍是当前Array

    var a1 = ['B', 'A', 'C'];
    var a2 = a1.sort();
    a1; // ['A', 'B', 'C']
    a2; // ['A', 'B', 'C']
    a1 === a2; // true, a1和a2是同一对象

    every

    every()方法可以判断数组的所有元素是否满足测试条件

    例如,给定一个包含若干字符串的数组,判断所有字符串是否满足指定的测试条件:

    var arr = ['Apple', 'pear', 'orange'];
    console.log(arr.every(function (s) {
        return s.length > 0;
    })); // true, 因为每个元素都满足s.length>0
    
    console.log(arr.every(function (s) {
        return s.toLowerCase() === s;
    })); // false, 因为不是每个元素都全部是小写

    find

    find()方法用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回undefined

    var arr = ['Apple', 'pear', 'orange'];
    console.log(arr.find(function (s) {
        return s.toLowerCase() === s;
    })); // 'pear', 因为pear全部是小写
    
    console.log(arr.find(function (s) {
        return s.toUpperCase() === s;
    })); // undefined, 因为没有全部是大写的元素

    findIndex

    findIndex()find()类似,也是查找符合条件的第一个元素,不同之处在于findIndex()会返回这个元素的索引,如果没有找到,返回-1

    var arr = ['Apple', 'pear', 'orange'];
    console.log(arr.findIndex(function (s) {
        return s.toLowerCase() === s;
    })); // 1, 因为'pear'的索引是1
    
    console.log(arr.findIndex(function (s) {
        return s.toUpperCase() === s;
    })); // -1

    forEach

    forEach()map()类似,它也把每个元素依次作用于传入的函数,但不会返回新的数组forEach()常用于遍历数组,因此,传入的函数不需要返回值:

    var arr = ['Apple', 'pear', 'orange'];
    arr.forEach(console.log); // 依次打印每个元素

     原文地址:https://www.liaoxuefeng.com/wiki/1022910821149312/1023021271742944

  • 相关阅读:
    Druid 使用 Kafka 将数据载入到 Kafka
    Druid 使用 Kafka 数据加载教程——下载和启动 Kafka
    Druid 集群方式部署 —— 启动服务
    Druid 集群方式部署 —— 端口调整
    Druid 集群方式部署 —— 配置调整
    Druid 集群方式部署 —— 配置 Zookeeper 连接
    Druid 集群方式部署 —— 元数据和深度存储
    Druid 集群方式部署 —— 从独立服务器部署上合并到集群的硬件配置
    Druid 集群方式部署 —— 选择硬件
    Druid 独立服务器方式部署文档
  • 原文地址:https://www.cnblogs.com/liangtao999/p/11795460.html
Copyright © 2011-2022 走看看