# 数组扁平化和柯里化
# 扁平化
将多维数组降维成一维数组
// 法1,使用递归实现
const flatten=(arr)=>arr.reduce((a,b)=>{
if(Array.isArray(b)){
return a.concat(flatten(b))
}else{
return a.concat(b)
}
},[])
const arr=[[1,2,3],3,[4,5],'f']
console.log(flatten(arr))
// 法2,使用递归实现
Array.prototype.falt = function() {
return [].concat(...this.map(item => (Array.isArray(item) ? item.falt() : [item])));
}
console.log(arr.falt());
// 法3,使用递推实现
const flatten = function (arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 柯里化
柯里化(英语:Currying),又称为部分求值,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回一个新的函数的技术,新函数接受余下参数并返回运算结果。
实现一个add方法,使计算结果能够满足如下预期:
add(1)(2)(3) = 6
add(1, 2)(3) = 6
1
2
2
实现方法: 做一个闭包,返回一个函数,这个函数每次执行会改写闭包里面记录参数的数组。当这个函数判断参数个数够了,就去执行它。
// 实现curry函数
function curry(func) {
// 存储已传入参数
let _args = []
// 做一个闭包
function _curry(...args) {
// 把参数合并
_args = _args.concat(args)
// 如果参数够了就执行
if (_args.length >= func.length) {
const result = func(..._args)
_args = []
return result;
}
// 继续返回此函数
else {
return _curry
}
}
return _curry
}
// 实现sum求和函数
function sum(a, b, c) {
return a + b + c
}
// 实现add函数
var add = curry(sum)
console.log(add(1)(2)(3))
console.log(add(1, 2)(3))
console.log(add(1)(2, 3))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32