高阶函数
- 编写高阶函数,就是让函数的参数能够接收别的函数。
function add(x, y, f) {
return f(x) + f(y);
}
var x =add(-5, 6, Math.abs)
console.log(x);//11
推导过程
x = -5;
y = 6;
f = Math.abs;
f(x) + f(y) ==> Math.abs(-5) + Math.abs(6) ==> 11;
return 11;
map()
由于map()方法定义在JavaScript的Array中,我们调用Array的map()方法,传入我们自己的函数,就得到了一个新的Array作为结果:
map()传入的参数是pow,即函数对象本身。
function pow(x) {
return x * x;
}
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
var results = arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
console.log(results);
把Array的所有数字转为字符串:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9']
把Array的所有字符串转为数字:
var arr = ['1', '2', '3', '4', '5', '6', '7', '8', '9'];
arr.map(i=>(i*1)) //[1, 2, 3, 4, 5, 6, 7, 8, 9]
练习
把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。
- 输入:[‘adam’, ‘LISA’, ‘barT’],输出:[‘Adam’, ‘Lisa’, ‘Bart’]。
```javascript function normalize(arr) { return arr.map(name=>name[0].toUpperCase()+name.substring(1).toLowerCase())
} normalize([‘adam’, ‘LISA’, ‘barT’]) //[ “Adam”, “Lisa”, “Bart” ]
<a name="savdm"></a>
### reduce
- 这个函数必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算,其效果就是:
`[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)`
<a name="EzUwX"></a>
#### 求和
```javascript
var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
return x + y;
}); // 25
求积
var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
return x*y;
}); // 25
function product(arr) {
return arr.reduce((x,y)=>{return x*y})
}
// 测试:
if (product([1, 2, 3, 4]) === 24 && product([0, 1, 2]) === 0 && product([99, 88, 77, 66]) === 44274384) {
console.log('测试通过!');
}
else {
console.log('测试失败!');
}
数组变整数
- [1, 3, 5, 7, 9]变换成整数13579
```javascript var arr = [1, 3, 5, 7, 9]; arr.reduce(function (x, y) { return x 10 + y;//{[(110+3)10+5]10+7}*10+9 }); // 13579
<a name="PK9nK"></a>
#### 字符串变成数字
- 先把字符串变数组,再利用reduce()转换成number
```javascript
//字符串变数组
function string2int(s) {
var arr=[];
for(var i of s){
arr.push(i)
}
return arr
}
string2int('1243') //['1','2','4','3' ]
- 再利用reduce()就可以写出一个把字符串转换为Number的函数
function string2int(s) {
var arr=[];
for(var i of s){
arr.push(i)
}
return arr.map(i=>(i*1)).reduce((x,y)=>(x*10+y))
}
string2int('1243')