11,高阶函数
11.1,高级函数的定义
JavaScript的函数其实都指向某个变量。既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
11.2,高价函数的应用
map 实现数组级别的f(x^2)
function f() {
var arr=[1,2,35,44];
var arr2 =arr.map(
function (x) {
return x*x;
}
);
console.log(arr2);//(4) [1, 4, 1225, 1936]
}
reduce 实现数组元素转数字 ,数组元素的求和,数组元素的求积
function f1() {
var arr=[1,2,3,4,5];
var arr2 =arr.reduce(function (x,y) {
return x*10+y;
});
var arr3 = arr.reduce(function (x,y) {
return x+y;
});
var arr4 =arr.reduce(function (x,y) {
return x*y;
});
console.log(arr2);//12345
console.log(arr3);//15
console.log(arr4);//120
}
map:请把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字
function f2(arr) {
var arr2 = arr.map(function (x) {
return x[0].toUpperCase()+x.substring(1,x.length).toLowerCase();
})
console.log(arr2);
}
注意点:arr.map会为调用的函数传入以下三个参数:
1、currentValue,数组中当前被传递的元素。
2、index,数组中当前被传递的元素的索引。
3、array,调用 map 方法的数组。
filter
filter也是一个常用的操作,它用于把Array
的某些元素过滤掉,然后返回剩下的元素。
和map()
类似,Array
的filter()
也接收一个函数。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是true
还是false
决定保留还是丢弃该元素。
//利用filter去除偶数元素
function f() {
var arr = [1,123,412,5,1231,1,23];
console.log(arr.filter(function (x) {
return x%2;
}));
}
f();//(6) [1, 123, 5, 1231, 1, 23]
可见用filter()
这个高阶函数,关键在于正确实现一个“筛选”函数。
filter 传入函数中的参数和map一致,我们可以利用index,实现数组的去重,保留数组的最后一个元素
r = arr.filter(function (element, index, self) {
return self.indexOf(element) === index;
});
sort
Array的sort方法同样是一个高阶函数,我们可以利用这一特性,实现自定义排序
这里注意一点,JavaScript 的sort 会把所有的元素,先转化为字符串就行比较
//利用sort自定义数字排序
function f() {
var arr = [2,124,412,6,1232,4,24];
console.log(arr.sort());//正常排序
console.log(arr.sort(function (x,y) {
if(x<y){
return -1;
}else if(x===y){
return 0;
}else{
return 1;
}
}));
}
f();// [1232, 124, 2, 24, 4, 412, 6]、[2, 4, 6, 24, 124, 412, 1232]
every
every()
方法可以判断数组的所有元素是否满足测试条件。
function f() {
var arr = [2,124,412,6,1232,4,24];
console.log(arr.every(function (x) {
if(x%2===0){
return true;
}else{
return false;
}
}));
}
f();//true
find
find()
方法用于查找符合条件的第一个元素,如果找到了,返回这个元素,否则,返回undefined
:
var arr = ['Apple', 'pear', 'orange'];
console.log(arr.find(function (s) {
return s.toLowerCase() === s;
})); // 'pear', 因为pear全部是小写
console.log(arr.find(function (s) {
return s.toUpperCase() === s;
})); // undefined, 因为没有全部是大写的元素
for each
forEach()
和map()
类似,它也把每个元素依次作用于传入的函数,但不会返回新的数组。forEach()
常用于遍历数组,因此,传入的函数不需要返回值:
var arr = ['Apple', 'pear', 'orange'];
arr.forEach(console.log); // 依次打印每个元素