高阶函数:JS函数都指向某个变量,既然变量可以指向函数,函数的参数也能接受变量,那么一个函数就可以接受另一个函数作为参数。
指的是满足下列条件之一的函数:
- 函数可以作为参数被传递
- 函数可以作为返回值输出
- 元素的筛选--filter
创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素
注意:
filter()不会对空数组进行检测
filter()不会改变原始数组
let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// 输出偶数列的数组
let sun = arr.filter(function(a) {
return a % 2 === 0;
})
console.log(sum); // [2, 4, 6, 8]
- map -- 映射
调用Array的map()方法,传入我们自己的函数,就得到一个新的Array作为结果
function pow(x) {
return x * x;
}
let arr =[1, 2, 3, 4, 5, 6, 7, 8, 9];
// map()传入的参数是pow,即函数对象本身
arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
事实上,它把运算规则抽象了,还可以计算任意复杂的函数。
3. reduce()
Array的reduce()把一个函数作用在这个Array的[x1, x2, x3...]上,这个函数必须接收两个参数,reduce()把结果和序列的下一个元素做累积计算:
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
// 比方说对一个Array求和,就可以用reduuce实现
let arr = [1, 3, 5, 7, 9];
arr.reduce(function(x, y) {
return x + y;
}); //25
- sort排序算法
会修改原数组
sort()方法默认把所有元素先转换为String再排序,结果'10'排在了'2'前面,因为字符'1'比字符'2'的ASCII码小,直接对数字排序,绝对掉进坑里。
sort()是一个高阶函数,它可以接受一个比较函数来实现自定义的排序。
// 要按数字大小排序,可以这么写
let arr1 = [10, 20, 1, 2];
arr1.sort(function(x, y) {
if (x < y) {
return -1;
}
if (x > y) {
return 1;
}
return 0;
}); // [1, 2, 10, 20]
// 如果要倒序排序,我们可以把大的数放前面
let arr2 = [10, 20, 1, 2];
arr2.sort(function (x, y) {
if (x < y) {
return 1;
}
if (x > y) {
return -1;
}
return 0;
}); // [20, 10, 2, 1]
// 对字符串排序,是按照ASCII的大小比较的,现在,排序应该忽略大小写,按照字母序排序
// 要实现这个算法,不必对现有代码大加改动,只有我们能定义出忽略大小写的比较算法就可以
let arr3 = ['Google', 'apple', 'Microsoft'];
arr3.sort(function (s1, s2) {
x1 = s1.toUpperCase();
x2 = s2.toUpperCase();
if (x1 < x2) {
return -1;
}
if (x1 > x2) {
return 1;
}
return 0;
}); // ['apple', 'Goole', 'Microsoft']
// 忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较
let a1 = ['B', 'A', 'C'];
let a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true,a1和a2是同一对象
// sort()方法会直接对原Array进行修改,它返回的结果仍然是Array
浙公网安备 33010602011771号