# 数组扁平化和柯里化

# 扁平化

将多维数组降维成一维数组

// 法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

# 柯里化

柯里化(英语:Currying),又称为部分求值,是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回一个新的函数的技术,新函数接受余下参数并返回运算结果。

实现一个add方法,使计算结果能够满足如下预期:

add(1)(2)(3) = 6
add(1, 2)(3) = 6
1
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
Last Updated: 3/22/2020, 3:45:51 PM