编写高阶函数,就是让函数的参数可以接收别的函数。javascript
例: java
function add(x, y, f) { return f(x) + f(y); }
(1)map()
map()
方法定义在JavaScript的Array
中,调用Array
的map()
方法,传入本身的函数,就获得了一个新的Array
做为结果
例: map()ArrayArraymap()Array
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]数组
map()传入的参数为函数;函数
例:网站
Array的把一个函数做用在这个的上,这个函数必须接收两个参数,把结果继续和序列的下一个元素作累积计算
例: var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.map(String); // ['1', '2', '3', '4', '5', '6', '7', '8', '9'],将数组中的元素转为字符串,放到新数组
(2)reduce
reduce()Array[x1, x2, x3...]reduce()
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
(3)练习题目
1.利用reduce()
求积:
答:
reduce()
function product(arr) {
return arr.reduce(function (x, y) {return x * y;});
}
function string2int(s) { 2.不要使用JavaScript内置的parseInt()
函数,利用map和reduce操做实现一个string2int()
函数:
答:
parseInt()string2int()
var arr=s.split('');
var arr2=arr.map(function(x){ return x*1});
var num=arr2.reduce(function (x, y) {return x * 10 + y;});
return num;spa
}code
3.请把用户输入的不规范的英文名字,变为首字母大写,其余小写的规范名字。输入:,输出:['adam', 'LISA', 'barT']['Adam', 'Lisa', 'Bart']
答:
function normalize(arr) {
var arr1=arr.map(function(x){return x.toUpperCase()});
var arr3=[]
for(let i=0;i<arr1.length;i++){
arr3[i]=arr1[i].substr(0,1)+arr1[i].substr(1).toLowerCase();
}
return arr3;
}
或
function normalize(arr) {
var arr2=arr.map(function(x){return x.substr(0,1).toUpperCase()+x.substr(1).toLowerCase()});//可直接得出结果
return arr2;
}
4.小明但愿利用把字符串变成整数,他写的代码很简洁:
var arr=['1','2','3'];
var r;
r = arr.map(parseInt);
结果居然是,小明百思不得其解,请帮他找到缘由并修正代码。
答:
var arr = ['1', '2', '3'];
var r;
r = arr.map(function(x){return parseInt(x)});
出错缘由:
map()1, NaN, NaN
因为map()
接收的回调函数能够有3个参数:callback(currentValue, index, array)
,一般咱们仅须要第一个参数,而忽略了传入的后面两个参数。orm
不幸的是,parseInt(string, radix)
没有忽略第二个参数,致使实际执行的函数分别是:ip
parseInt('1', 0); // 1, 按十进制转换字符串
parseInt('2', 1); // NaN, 没有一进制
parseInt('3', 2); // NaN, 按二进制转换不容许出现3
能够改成r = arr.map(Number);
,由于Number(value)
函数仅接收一个参数。
参考廖雪峰老师的官方网站