# JavaScript 高阶函数

# 一、概念

高阶函数就是函数的参数也是一个函数。

function add(x, y, f) {
    return f(x) + f(y);
}

var result = add(-5, 9, Math.abs)

console.log(result) // output: 14
1
2
3
4
5
6
7

f 是一个函数,但它是 add 函数的一个参数。

# 二、map

map() 方法会创建一个新数组,这个新数组是由原来的数组的每一个元素调用一次提供的函数后的返回值组成的。 对 arr 数组的每一个值执行 pow 函数操作,省去编写 for 循环。

'use strict';

function pow(x) {
    return x * x;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // output: [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);
1
2
3
4
5
6
7
8

数组所有值转为 String

var arr = [1, 2, 3, 4, 5];
var strArr = arr.map(String);
console.log(strArr); // output: ["1", "2", "3", "4", "5"]
1
2
3

# 三、reduce

reduce() 接受两个参数,进行一次运算后,把这次运算的结果作为下一次运算的第一个参数。 [x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4) x1x2 进行运算后比如说生成 y1y1 作为新的第一个参数,之后 y1x3 进行运算生成 y2 ,依次进行。

接下来做一些练习。

# 3.1 求和

var arr = [1, 2, 3, 4, 5]
var value = arr.reduce(function(x, y) {
    // 实现数组的总和
	return x + y;
})
console.log(value); // output: 15
1
2
3
4
5
6

# 3.2 求积

var arr = [1, 2, 3, 4, 5]
var value = arr.reduce(function(x, y) {
    // 求积
	return x * y;
})
console.log(value); // output: 120
1
2
3
4
5
6

# 3.3 字符串转数字

/**
 * 将字符串转为数字
 *
 * @param s 字符串
 * @returns 
 */
function string2int(s) {
    if (s.length == 1) {
        let k = s - 0;
        return k;
    }

    // 先把字符串转为数组
    var strArr = s.split("")

    // 将数组转为 number
    var k = strArr.reduce(function(x, y) {
        return x + y - 0;
    })
    // console.log(typeof(k)); // number
    // console.log(k);
    return k;
}
    console.log(string2int('123456')); // output: 123456
    console.log(string2int('12300'));  // output: 12300
    console.log(string2int('0'));      // output: 0
    console.log(string2int('0123'));   // output: 123
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

# 3.4 规范英文名称

/**
 * 使英文名称规范,第一个字母大写,其余小写

 * @param {* } arr 
 * @returns 
 */
function normalize(arr) {
    // 获取第一个字母然后转为大写,获取剩下的字母转为小写,然后将两个拼接
    return arr.map(item =>
        item.slice(0, 1).toUpperCase() + item.slice(1).toLowerCase()
    )
}

console.log(normalize(["abCD", "abcD", "AbcD"])); // output:["Abcd","Abcd","Abcd"]
1
2
3
4
5
6
7
8
9
10
11
12
13
14

# 3.5 字符串转整数

'use strict';

var arr = ['1', '2', '3'];
var r = arr.map(item =>
    parseInt(item)
);

console.log(r); // output: [1, 2, 3]
1
2
3
4
5
6
7
8
'use strict';

var arr = ['1', '2', '3'];
var r = arr.map(Number);

console.log(r); // output: [1, 2, 3]
1
2
3
4
5
6

# 三、参考资料

map/reduce (opens new window)