JS中几种常见的高阶函数
高阶函数:英文叫Higher-order function。JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
一个最简单的高阶函数:
- function add(x, y, f) {
- return f(x) + f(y);
- }
- //当调用add(-5, 6, Math.abs)时,参数x,y和f分别接收-5,6和函数Math.abs,根据函数定义,可以推导计算过程为:
- //x = -5;
- //y = 6;
- //f = Math.abs;
- //f(x) + f(y) ==> Math.abs(-5) + Math.abs(6) ==> 11;
- //return 11;
- //用代码验证一下:
- add(-, , Math.abs); //
编写高阶函数,就是让函数的参数能够接收别的函数。
下面介绍三个高阶函数:
一、map/reduce
如果你读过Google的那篇大名鼎鼎的论文“MapReduce: Simplified Data Processing on Large Clusters”,你就能大概明白map/reduce的概念。由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:
1、map():
- function pow(x) {
- return x * x;
- }
- var arr = [, , , , , , , , ];
- arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
- //map()传入的参数是pow,即函数对象本身。
- //不需要map(),写一个循环,也可以计算出结果:
- var f = function (x) {
- return x * x;
- };
- var arr = [, , , , , , , , ];
- var result = [];
- for (var i=; i<arr.length; i++) {
- result.push(f(arr[i]));
- }
- //的确可以,但是,从上面的循环代码,我们无法一眼看明白“把f(x)作用在Array的每一个元素并把结果生成一个新的Array”。
所以,map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x2,还可以计算任意复杂的函数,比如,把Array的所有数字转为字符串:
- var arr = [, , , , , , , , ];
- arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
- //只需要一行代码。
2、reduce():
再看reduce的用法。Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是:
- [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
- //比方说对一个Array求和,就可以用reduce实现:
- var arr = [, , , , ];
- arr.reduce(function (x, y) {
- return x + y;
- }); //
二、filter
filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素。和map()类似,Array的filter()也接收一个函数。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。
- //例如,在一个Array中,删掉偶数,只保留奇数,可以这么写:
- var arr = [, , , , , , , ];
- var r = arr.filter(function (x) {
- return x % !== ;
- });
- 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()方法
- });
- arr; // ['A', 'B', 'C']
可见用filter()这个高阶函数,关键在于正确实现一个“筛选”函数。
回调函数:filter()接收的回调函数,其实可以有多个参数。通常我们仅使用第一个参数,表示Array的某个元素。回调函数还可以接收另外两个参数,表示元素的位置和数组本身:
- var arr = ['A', 'B', 'C'];
- var r = arr.filter(function (element, index, self) {
- console.log(element); // 依次打印'A', 'B', 'C'
- console.log(index); // 依次打印0, 1, 2
- console.log(self); // self就是变量arr
- return true;
- });
- //利用filter,可以巧妙地去除Array的重复元素:
- 'use strict';
- var r,
- arr = ['apple', 'strawberry', 'banana', 'pear', 'apple', 'orange', 'orange', 'strawberry'];
- r = arr.filter(function (element, index, self) {
- return self.indexOf(element) === index;
- });
- alert(r.toString());
- //去除重复元素依靠的是indexOf总是返回第一个元素的位置,后续的重复元素位置与indexOf返回的位置不相等,因此被filter滤掉了。
三、sort排序算法
因为Array的sort()方法默认把所有元素先转换为String再排序,结果'10'排在了'2'的前面,因为字符'1'比字符'2'的ASCII码小。如果不知道sort()方法的默认排序规则,直接对数字排序,绝对栽进坑里!
幸运的是,sort()方法也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。
- //要按数字大小排序,我们可以这么写:
- var arr = [, , , ];
- arr.sort(function (x, y) {
- if (x < y) {
- return -;
- }
- if (x > y) {
- return ;
- }
- return ;
- }); // [1, 2, 10, 20]
- //如果要倒序排序,我们可以把大的数放前面:
- var arr = [, , , ];
- arr.sort(function (x, y) {
- if (x < y) {
- return ;
- }
- if (x > y) {
- return -;
- }
- return ;
- }); // [20, 10, 2, 1]
- //默认情况下,对字符串排序,是按照ASCII的大小比较的,现在,排序应该忽略大小写,按照字母序排序。
- //要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:
- var arr = ['Google', 'apple', 'Microsoft'];
- arr.sort(function (s1, s2) {
- x1 = s1.toUpperCase();
- x2 = s2.toUpperCase();
- if (x1 < x2) {
- return -;
- }
- if (x1 > x2) {
- return ;
- }
- return ;
- }); // ['apple', 'Google', 'Microsoft']
- //忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。
- //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是同一对象
JS中几种常见的高阶函数的更多相关文章
- JS中几种常见的数组算法(前端面试必看)
JS中几种常见的数组算法 1.将稀疏数组变成不稀疏数组 /** * 稀疏数组 变为 不稀疏数组 * @params array arr 稀疏数组 * @return array 不稀疏的数组 */ f ...
- Javascript 常见的高阶函数
高阶函数,英文叫 Higher Order function.一个函数可以接收另外一个函数作为参数,这种函数就叫做高阶函数. 示例: function add(x, y, f) { return f( ...
- 海选与包装,Python中常用的两个高阶函数(讲义)
一.filter(function, iterable) - 过滤("海选") # 判断落在第一象限的点[(x1, y1), (x2, y2)...] points = [(-1, ...
- js中几种常见的方法的实例 shift,unshift,push,prop
1.shift()定义和用法 shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值. 语法:arrayObject.shift() 返回值:数组原来的第一个元素的值. 说明:如果 ...
- JS中的高阶函数
JS中的高阶函数 高阶函数是指以函数作为参数的函数,并且可以将函数作为结果返回的函数. 1. 高阶函数 接受一个或多个函数作为输入 输出一个函数 至少满足以上一个条件的函数 在js的内置对象中同样存在 ...
- 浅谈JS高阶函数
引入 我们都知道函数是被设计为执行特定任务的代码块,会在某代码调用它时被执行,获得返回值或者实现其他功能.函数有函数名和参数,而函数参数是当调用函数接收的真实的值. 今天要说的高阶函数的英文为High ...
- Scala中的构造器和高阶函数
构造器 在定义类时可以定义主构造器.主构造器可以同时声明字段. /** * 主构造器 * @author Administrator */ //在scala中,类和方法交织在一起 class Test ...
- 高阶函数---swift中的泛型介绍(一步步实现Map函数)
说明 本文内容均出自函数式 Swift一书, 此处整理仅仅是为了自己日后方便查看, 需要深入研究的话, 可以点进去购买, 支持原作者 本书由 王巍–新浪微博大神翻译 OneV's Den 喵神博客 接 ...
- Scala集合操作中的几种高阶函数
Scala是函数式编程,这点在集合操作中大量体现.高阶函数,也就是能够接收另外一个函数作为参数的函数. 假如现在有一个需要是将List集合中的每个元素变为原来的两倍,现在来对比Java方式实现和Sca ...
随机推荐
- GCH实践经验
服务器: 终端整机: 办公套件: 杀毒软件: 打印机:
- [ICPC 北京 2017 J题]HihoCoder 1636 Pangu and Stones
#1636 : Pangu and Stones 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 In Chinese mythology, Pangu is the fi ...
- 【CF434D】Nanami's Power Plant 最小割
[CF434D]Nanami's Power Plant 题意:有n个二次函数$y=a_ix^2+b_ix+c_i$($a_i,b_i,c_i$是整数),第i个函数要求x的取值在$[l_i,r_i]$ ...
- SQL 四大功能DDL/DML/DCL/TCL
SQL主要分成四部分:(1)数据定义.(SQL DDL)用于定义SQL模式.基本表.视图和索引的创建和撤消操作.(2)数据操纵.(SQL DML)数据操纵分成数据查询和数据更新两类.数据更新又分成插入 ...
- gym 101657 D
理论1A. //没删debug的文件读入.. 傻逼题. 先求出来每条边两侧的三角形,然后枚举边,根据叉积判断三角形位置,建图,拓扑排序. #include <bits/stdc++.h> ...
- swust oj 1068
图的按录入顺序深度优先搜索 5000(ms) 10000(kb) Tags: 深度优先 图的深度优先搜索类似于树的先根遍历,即从某个结点开始,先访问该结点, 然后深 ...
- python全栈开发 * 36知识点汇总 * 180721
36 操作系统的发展史 进程一.手工操作--穿孔卡片 1.内容: 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制 台开关启动程序针对 ...
- JSON.parse()和JSON.stringify()的解析与用途
JSON.parse()和JSON.stringify()的解析与用途 1.parse用于从一个字符串中解析出json对象 如: var str = '{"name":" ...
- 《Mysql 分区分表》
一:分区/分表 为了什么? - 当MySQL单表的数据量过大时,数据库的访问速度会下降,需要处理大量数据,所以需要把数据分散存储. - 常用 "水平" 切分 二:MySQL常见的水 ...
- FQ原理
笔者在nginx反向代理篇讲了正向代理和反向代理的区别,今天着重讲其中的FQ是实现原理. 一.普遍的两种方式 1.vpn vpn它将客户端的IP数据报经过加密和二次封装后转发出去,客户端通过vpn上网 ...