高阶函数及 map、reduce、filter 的实现
博客地址:https://ainyi.com/85
2020 开年国家经历了不少困难,最为凶猛的局势就是新型冠状病毒的蔓延,国务院最终决定春节假期延长至==2 月 2 号==;公司决定 3 - 7 号在家用 vpn 办公。10 号正式在职场上班;
在这个看似漫无止境的春节假期中,在家宅着不出门就是对社会最好的贡献,那么一直待在家也确实无聊极致,索性学习学习、看看书吧,再学习学习 JavaScript 的函数吧
函数
函数是函数式编程的工作单元与中心。函数是任何可调用你且可通过 () 操作求值的表达式。
JavaScript 函数有两个支柱性的重要特性:一等函数和高阶函数
一等函数就是最常见的,如:
function multiplier(a, b) {
return a * b
}
let square = function(x) {
return x * x
}
// lambda 表达式(箭头函数)
let square = x => x * x
主要说说高阶函数
高阶函数
鉴于函数的行为与普通对象类似,其理所当然地可以作为其他函数的参数进行传递,或是由其他函数返回。这些函数则称为高阶函数。~JavaScript函数式编程指南p36~
例如 Array.sort 的 comparator 函数就是高阶函数(传送门:https://ainyi.com/41 -> sort 函数)
function add(a) {
return function(b) {
return a + b
}
}
add(1)(2)
上面例子,add 函数接收一个参数,并返回另一个接收第二个参数并把它们加在一起的函数
函数柯里化能够很好地体现高阶函数的应用
function currying(fn, length) {
length = length || fn.length;
return function (...args) {
return args.length >= length
? fn.apply(this, args)
: currying(fn.bind(this, ...args), length - args.length)
}
}
const add = currying(function(a, b, c) {
console.log([a, b, c].reduce((a, b) => a + b))
})
add(1, 2, 3) // 6
add(1, 2)(3) // 6
add(1)(2)(3) // 6
add(1)(2, 3) // 6
兼容各种 add 调用的高阶函数
详情看我之前写的文章 js 高阶函数之柯里化
map、reduce、filter
此三种函数均为高阶函数,如何实现这三个函数,接下来看看。
一般重写对象的实例方法是通过 prototype,数组的所有实例方法、属性都保存在 Array.prototype。只不过平常都是通过该对象的实例调用
通过 .实例方法,该实例方法的 this 指针指向
map 的实现
高阶函数 map 能够将一个迭代函数有序地应用于一个数组中的每个元素,并返回一个长度相等的新数组
function map(fn) {
let idx = -1,
len = this.length,
result = new Array(len)
while (++idx < len) {
result[idx] = fn(this[idx], idx, this)
}
console.log('myself')
return result
}
Array.prototype.map = map;
[1, 2, 3].map(ele => `#${ele}#`)
// myself
// ["#1#", "#2#", "#3#"]
reduce 实现
高阶函数 reduce 将一个数组中的元素精简为单一的值,该值是由每个元素与一个累计值通过一个函数计算得出的
function reduce(fn, accumulator) {
let idx = -1,
len = this.length
if (!accumulator && len > 0) {
accumulator = this[++idx]
}
while (++idx < len) {
accumulator = fn(accumulator, this[idx], idx, this)
}
console.log('myself')
return accumulator
}
Array.prototype.reduce = reduce;
[1, 2, 3].reduce((n, p) => n + p)
// myself
// 6
// 也可以指定第一个累计值
[1, 2, 3].reduce((n, p) => n + p, 100)
// myself
// 106
filter 的实现
高阶函数 filter 能够遍历数组中的元素并过滤后返回一个新子集数组
function filter(fn) {
let idx = -1,
len = this.length
result = []
while (++idx < len) {
let value = this[idx]
if (fn(value, idx, this)) {
result.push(value)
}
}
console.log('myself')
return result
}
Array.prototype.filter = filter;
[1, 2, 3].filter(ele => ele >= 2)
// myself
// [2, 3]
博客地址:https://ainyi.com/85
高阶函数及 map、reduce、filter 的实现的更多相关文章
- js基础--高阶函数(map,reduce,filter,sort)
高阶函数 一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数,编写高阶函数,就是让函数的参数能够接收别的函数. function add (x,y,f){return f(x)+f(y)} ...
- Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)...啊啊啊
函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计.函数就是面向过程的程序设计 ...
- (转)Python进阶:函数式编程(高阶函数,map,reduce,filter,sorted,返回函数,匿名函数,偏函数)
原文:https://www.cnblogs.com/chenwolong/p/reduce.html 函数式编程 函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数 ...
- js 高阶函数(map/reduce/filter/sort)
1.map - 方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值(注:map不会对空数组进行检测,不会改变原始数组) 语法:array.map(function(currentValu ...
- python的高阶函数(map,reduce,filter)
Map函数 Map()函数接受两个参数,第一个参数是函数,第二个参数是序列(list,tuple),map将函数依次作用到序列上的每一个元素上,并发结果作为新的list返回 其中map的第一个参数的函 ...
- python3高阶函数:map(),reduce(),filter()的区别
转载请注明出处:https://www.cnblogs.com/shapeL/p/9057152.html 1.map():遍历序列,对序列中每个元素进行操作,最终获取新的序列 print(list( ...
- python 函数式编程:高阶函数,map/reduce
python 函数式编程:高阶函数,map/reduce #函数式编程 #函数式编程一个特点就是,允许把函数本身作为参数传入另一个函数,还允许返回一个函数 #(一)高阶函数 f=abs f print ...
- python_08 函数式编程、高阶函数、map、filter、reduce函数、内置函数
函数式编程 编程方法论: 1.面向过程 找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程 (1).搜索目标,用户输入(配偶要求),按照要求到数据结构内检索合适的任务 (2)表白,表白成功进入 ...
- python高阶函数,map,filter,reduce,ord,以及lambda表达式
为什么我突然扯出这么几个函数,是因为我今天在看流畅的python这本书的时候,里面有一部分内容看的有点懵逼. >>> symbols = '$¢£¥€¤' >>> ...
- [py][lc]python高阶函数(匿名/map/reduce/sorted)
匿名函数 - 传入列表 f = lambda x: x[2] print(f([1, 2, 3])) # x = [1,2,3] map使用 传入函数体 def f(x): return x*x r ...
随机推荐
- Python之time模块和datatime模块
import time time.sleep(5) #休眠 time.time() #返回系统时间戳 utc时间秒数 time.ctime() #返回字符串时间格式,也可以传入参数转换为字符串时间ti ...
- Redis安装(单机及各类集群,阿里云)
Redis安装(单机及各类集群,阿里云) 前言 上周,我朋友突然悄悄咪咪地指着手机上的一篇博客说,这是你的博客吧.我看了一眼,是之前发布的<Rabbit安装(单机及集群,阿里云>.我朋友很 ...
- 面试必问之 ConcurrentHashMap 线程安全的具体实现方式
作者:炸鸡可乐 原文出处:www.pzblog.cn 一.摘要 在之前的集合文章中,我们了解到 HashMap 在多线程环境下操作可能会导致程序死循环的线上故障! 既然在多线程环境下不能使用 Hash ...
- springboot-集成WebSockets广播消息
一 WebScoketS 简介 RFC 6455 即 webSockets 协议提供了一种标准化的方式去建立全双工,双方面交流的通道在客户端和服务端甚至单一的TCP连接中进行通信: webSocket ...
- 大数据hadoop集群部署(一)
环境系统配置 JAVA虚拟机的安装
- 作业要求 20191010-1 Alpha阶段贡献分配规则
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2019fall/homework/8744 贡献分分配规则: 小组五位成员,每位成员有入团队贡献分10分,每个 ...
- [gitHub实践] git基础:远程仓库的使用
[gitHub实践] git基础:远程仓库的使用 版权2019.6.2更新 git 基础 远程仓库的使用 git remote # 查看远程仓库 $ git remote # 克隆的仓库服务器默认名字 ...
- shell正则表达式和cut命令
正则表达式 符号 描述 $ 匹配输入字符串的结尾位置 () 标记一个子表达式的开始和结束位置 * 匹配前面的子表达式零次或多次 + 匹配前面的子表达式一次或多次 . 匹配除换行符(\n)之外的任何单字 ...
- 在EasyUI项目中使用FileBox控件实现文件上传处理
我在较早之前的随笔<基于MVC4+EasyUI的Web开发框架形成之旅--附件上传组件uploadify的使用>Web框架介绍中介绍了基于Uploadify的文件上传操作,免费版本用的是J ...
- Java防锁屏小程序
为防止系统桌面自动锁屏,只需打成jar包,写个批处理程序start.bat,双击执行保持dos窗口执行即可,无其他影响. 程序设计为每30秒动一次鼠标,可根据需要调整. 附代码: package ma ...