JavaScript高阶函数map/reduce、filter和sort
map()
举例说明,比如我们有一个函数f(x)=x²,要把这个函数作用在一个数组[1,2,3,4,5,6,7,8,9]上。
由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:
function pow(x) {
return x*x;
}
var arr = [1,2,3,4,5,6,7,8,9];
arr.map(pow);//[1,4,9,16,25,36,49,64,81]
map()传入的参数是pow,即函数对象本身。
map()作为高阶函数,事实上它把运算规则抽象了,因为,我们不但可以计算简单的f(x)=x²,还可以计算任意复杂的函数,比如Array的所有数字转为字符串:
var arr = [1,2,3,4,5,6,7,8,9];
arr.map(String);//['1','2','3','4','5','6','7','8','9']
//只需要一行代码
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 = [1,3,5,7,9];
arr.reduce(function(x,y){
return x+y;
});//
要把[1,3,5,7,9]变换成整数13579,reduce()也能派上用场:
var arr = [1,3,5,7,9];
arr.reduce(function(x,y) {
return x*10+y;
});//
filter()
filter也是一个常用的操作,它用于把Array的某些元素过滤掉,然后返回剩下的元素。
和map()类似,Array的filter()也接收一个函数。和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']
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;
})
sort
排序算法:
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序。排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较。但如果是字符串或者两个对象呢?直接比较数字上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x和y,如果认为x<y,则返回-1,如果x==y,则返回0,如果认为x>y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较的结果直接排序。
Array的sort()方法就是用于排序的。但是排序结果可能让你大吃一惊。
这是因为Array的sort()方法默认把所有元素先转换为String再排序,结果‘10’排在了‘2’的前面,因为字符‘1’比字符‘2’的ASCII码小。
如果不知道sort()方法的默认排序规则,直接对数字排序,大吃一惊。
sort()也是一个高阶函数。可以接收一个比较函数实现自定义排序。
var arr=[10,20,1,2];
arr.sort(function(x,y){
if(x<y) {
return -1;
}
if(x>y) {
return 1;
}
return 0;
});//[1,2,10,20]
默认情况下,对字符串排序,是按照ASCII的大小比较的,现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:
var arr = ['Google','apple','Microsoft'];
arr.sort(function (s1,s2){
x1 = s1.toUpperCase();
x2 = s2.toUpperCase();
if(x1<x2) {
return -1;
}
if(x1>x2) {
return 1;
}
return 0;
});//['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是同一对象。
JavaScript高阶函数map/reduce、filter和sort的更多相关文章
- JavaScript高阶函数 map reduce filter sort
本文是笔者在看廖雪峰老师JavaScript教程时的个人总结 高阶函数 一个函数就接收另一个函数作为参数,这种函数就称之为高阶函数 1.高阶函数之map: ...
- python--函数式编程 (高阶函数(map , reduce ,filter,sorted),匿名函数(lambda))
1.1函数式编程 面向过程编程:我们通过把大段代码拆成函数,通过一层一层的函数,可以把复杂的任务分解成简单的任务,这种一步一步的分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计的基本单元. ...
- Python 函数式编程 & Python中的高阶函数map reduce filter 和sorted
1. 函数式编程 1)概念 函数式编程是一种编程模型,他将计算机运算看做是数学中函数的计算,并且避免了状态以及变量的概念.wiki 我们知道,对象是面向对象的第一型,那么函数式编程也是一样,函数是函数 ...
- Python学习 Day 5 高阶函数 map/reduce filter sorter 返回函数 匿名函数 装饰器 偏函数
高阶函数Higher-orderfunction 变量可以指向函数 >>> abs #abs(-10)是函数调用,而abs是函数本身 <built-in function ab ...
- 函数式编程 高阶函数 map&reduce filter sorted
函数式编程 纯函数:没有变量的函数 对于纯函数而言:只要输入确定,那么输出就是确定的.纯函数是没有副作用的. 函数式编程:允许把函数本身作为参数传入另一个函数,还允许返回一个函数 高阶函数:一个函数的 ...
- Python高阶函数_map/reduce/filter函数
本篇将开始介绍python高阶函数map/reduce/filter的用法,更多内容请参考:Python学习指南 map/reduce Python内建了map()和reduce()函数. 如果你读过 ...
- 辅助函数和高阶函数 map、filter、reduce
辅助函数和高阶函数 map.filter.reduce: 一.辅助函数:(1-1)响应式函数 (数组更新检测): push() pop() shift() unshift() ...
- python之高阶函数map/reduce
L = [] for n in [1, 2, 3, 4, 5, 6, 7, 8, 9]: L.append(f(n)) print(L) Python内建了map()和reduce()函数. 我们先看 ...
- python笔记十四(高阶函数——map/reduce、filter、sorted)
一.map/reduce 1.map() map(f,iterable),将一个iterable对象一次作用于函数f,并返回一个迭代器. >>> def f(x): #定义一个函数 ...
随机推荐
- [转]mvc5+ef6+Bootstrap 项目心得--身份验证和权限管理
本文转自:http://www.cnblogs.com/shootingstar/p/5629668.html 1.mvc5+ef6+Bootstrap 项目心得--创立之初 2.mvc5+ef6+B ...
- c#-FrameWork01
Framwork ArrayList l 集合类似于数组,同样是用来存放连续数据的,但集合的功能比数组更强大 l 集合和数组的最大区别:数组一旦定义以后就无法改变其大小,而集合可以动态的改变其大小 ...
- Hashtable元素的遍历
遍历用到DictionaryEntry(字典键/值对) 实例 创建一个Hashtable对象,向其中添加4个元素,然后遍历 static void Main(string[] args) { Hash ...
- node.js中的模板引擎jade、handlebars、ejs
使用node.js的Express脚手架生成项目默认是jade模板引擎,jade引擎实在是太难用了,这么难用还敢设为默认的模板引擎,过分了啊!用handlebars模板引擎写还说的过去,但笔者更愿意使 ...
- (三)css之浮动&定位
众所周知,一个页面可能包含多个div,如何对这些div进行排列,以便具有较好的显示效果呢? css提供了浮动和定位两个属性进行div的排列,下面主要针对浮动和定位进行详细地阐述. (一)何为浮动? 浮 ...
- mybatis一对多映射
场景: A:SecControlRulePojo.java B:SecControlSubRulePojo C:SecControlSubRuleManyPojo 实体A中包含List<B> ...
- Spring Cloud Ribbon负载均衡配置类放在Spring boot主类同级增加Exclude过滤后报Field config in com.cloud.web.controller.RibbonConfiguration required a bean of type 'com.netflix.client.config.IClientConfig' that could not b
环境: Spring Cloud:Finchley.M8 Spring Boot:2.0.0.RELEASE 目录结构: 可以看到代码第13行的注释,我已经在@ComponentScan注解中添加了E ...
- Number()转换规则
转换规则: Number(): 1)如果是Boolean值,true和false将分别转换为1和0. 2)如果是数字值,只是简单的传入和返回. 3)如果是null值,返回0. 4)如果是undefin ...
- EBS登陆界面IE显示异常
使用在IE浏览登陆EBS时: 在登陆界面,登录和取消的按钮显示异常: 在进入HOME界面时,显示的职责全为undefined. 原因: 由于IE版本的兼容性. 解决方法: 浏览器 菜单->工具- ...
- 怎样在vs2013和vs2015中实现自动编译sass
Visual Studio不论是2013版本还是2015版本要自动编译都需要添加扩展. 添加扩展的方法,路径“工具”->“扩展和更新”,在打开的窗口“搜索”你需要的扩展根据提示“下载”和“安装” ...