-
Notifications
You must be signed in to change notification settings - Fork 1.1k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
【进阶 6-1 期】JavaScript 高阶函数浅析 #36
Comments
没看答案,仅仅是对当前题目的简单实现,我感觉去重和排序应该拿出来,但不知道放哪好 |
|
[...new Set(arr.toString().split(",").sort((a,b)=>{ return a-b}))] |
flat了解一下 |
var data = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
function flatDepth(arr){
return arr.reduce((total, cur) => {
if(Object.prototype.toString.call(cur)==='[object Array]'){
return total.concat(flatDepth(cur))
} else {
return total.concat(cur)
}
}, [])
}
[...new Set(flatDepth(data)].sort((a, b) => {return a-b}) |
const flatArr = arr => {
return arr.reduce( (acc, el) => {
return Array.isArray(el) ? acc.concat(flatArr(el)) : acc.concat(el)
}, [])
}
const sortArr = arr => {
return [...new Set(arr)].sort((a, b) => a - b);
}
const arr = [1, 2, 3, [1, [2, [3], 4, 5]]];
console.log(sortArr(flatArr(arr))); // [ 1, 2, 3, 4, 5 ] |
这个add(3)我控制打出的不是数字,是f 3函数这个样子,在后面添加了add(3).toString()才打印出了3,请问打印函数为啥没有自动执行重写的toString方法呢? |
|
var arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10];
let flatArr = arr => {
return arr.reduce((pre, cur) => {
return Array.isArray(cur) ? pre.concat(flatArr(cur)) : pre.concat(cur)
}, [])
}
let sortArr = arr => {
return [...new Set(arr)].sort((pre, cur) => pre - cur)
} |
const arr = [ [1, 2, 2], [3, 4, 5, 5], [6, 7, 8, 9, [11, 12, [12, 13, [14] ] ] ], 10]; |
放心吧,我已经收到啦。
|
你的来信我一收到 谢谢哈 ~~~~
|
存收到,谢谢!
|
引言
本期开始介绍 JavaScript 中的高阶函数,在 JavaScript 中,函数是一种特殊类型的对象,它们是 Function objects。那什么是高阶函数呢?本节将通过高阶函数的定义来展开介绍。
高阶函数
高阶函数英文叫 Higher-order function,它的定义很简单,就是至少满足下列一个条件的函数:
也就是说高阶函数是对其他函数进行操作的函数,可以将它们作为参数传递,或者是返回它们。 简单来说,高阶函数是一个接收函数作为参数传递或者将函数作为返回值输出的函数。
函数作为参数传递
JavaScript 语言中内置了一些高阶函数,比如 Array.prototype.map,Array.prototype.filter 和 Array.prototype.reduce,它们接受一个函数作为参数,并应用这个函数到列表的每一个元素。我们来看看使用它们与不使用高阶函数的方案对比。
Array.prototype.map
map()
方法创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果,原始数组不会改变。传递给 map 的回调函数(callback
)接受三个参数,分别是 currentValue、index(可选)、array(可选),除了callback
之外还可以接受 this 值(可选),用于执行callback
函数时使用的this
值。来个简单的例子方便理解,现在有一个数组
[1, 2, 3, 4]
,我们想要生成一个新数组,其每个元素皆是之前数组的两倍,那么我们有下面两种使用高阶和不使用高阶函数的方式来实现。不使用高阶函数
使用高阶函数
Array.prototype.filter
filter()
方法创建一个新数组, 其包含通过提供函数实现的测试的所有元素,原始数组不会改变。接收的参数和 map 是一样的,其返回值是一个新数组、由通过测试的所有元素组成,如果没有任何数组元素通过测试,则返回空数组。来个例子介绍下,现在有一个数组
[1, 2, 1, 2, 3, 5, 4, 5, 3, 4, 4, 4, 4]
,我们想要生成一个新数组,这个数组要求没有重复的内容,即为去重。不使用高阶函数
使用高阶函数
Array.prototype.reduce
reduce()
方法对数组中的每个元素执行一个提供的 reducer 函数(升序执行),将其结果汇总为单个返回值。传递给 reduce 的回调函数(callback
)接受四个参数,分别是累加器 accumulator、currentValue、currentIndex(可选)、array(可选),除了callback
之外还可以接受初始值 initialValue 值(可选)。如果没有提供 initialValue,那么第一次调用
callback
函数时,accumulator 使用原数组中的第一个元素,currentValue 即是数组中的第二个元素。 在没有初始值的空数组上调用 reduce 将报错。如果提供了 initialValue,那么将作为第一次调用
callback
函数时的第一个参数的值,即 accumulator,currentValue 使用原数组中的第一个元素。来个简单的例子介绍下,现在有一个数组
[0, 1, 2, 3, 4]
,需要计算数组元素的和,需求比较简单,来看下代码实现。不使用高阶函数
使用高阶函数
无 initialValue 值
上面是没有 initialValue 的情况,代码的执行过程如下,callback 总共调用四次。
有 initialValue 值
我们再来看下有 initialValue 的情况,假设 initialValue 值为 10,我们看下代码。
代码的执行过程如下所示,callback 总共调用五次。
函数作为返回值输出
这个很好理解,就是返回一个函数,下面直接看两个例子来加深理解。
isType 函数
我们知道在判断类型的时候可以通过
Object.prototype.toString.call
来获取对应对象返回的字符串,比如:可以发现上面三行代码有很多重复代码,只需要把具体的类型抽离出来就可以封装成一个判断类型的方法了,代码如下。
这里就是一个高阶函数,因为 isType 函数将
obj => { ... }
这一函数作为返回值输出。add 函数
我们看一个常见的面试题,用 JS 实现一个无限累加的函数
add
,示例如下:我们可以看到结构和上面代码有些类似,都是将函数作为返回值输出,然后接收新的参数并进行计算。
我们知道打印函数时会自动调用
toString()
方法,函数add(a)
返回一个闭包sum(b)
,函数sum()
中累加计算a = a + b
,只需要重写sum.toString()
方法返回变量a
就可以了。思考题
已知如下数组,编写一个程序将数组扁平化去并除其中重复部分数据,最终得到一个升序且不重复的数组
参考解析:扁平化并去重
参考文章
文章穿梭机
【进阶5-3期】深入探究 Function & Object 鸡蛋问题
【进阶5-2期】图解原型链及其继承优缺点
【进阶5-1期】重新认识构造函数、原型和原型链
交流
进阶系列文章汇总如下,觉得不错点个Star,欢迎 加群 互相学习。
我是木易杨,公众号「高级前端进阶」作者,跟着我每周重点攻克一个前端面试重难点。接下来让我带你走进高级前端的世界,在进阶的路上,共勉!
The text was updated successfully, but these errors were encountered: