0.前言
今天继续使用廖大的教程进行javascript的学习。主要学习了filter()
和sort()
等高阶函数。虽然完成了廖大的练习题,但是自己还是有自知之明的,从实际的角度上来说,我还是没有完全搞懂高阶函数,包括之前的map()
和reduce()
。
1. filter()函数
filter()
函数可以用来过滤数组,将剩下的元素组合返回。filter()
也接收一个函数。和map()
不同的是,filter()
把传入的函数依次作用于每个元素,然后根据返回值是true还是false决定保留还是丢弃该元素。
var arr = [1, 2, 4, 5, 6, 9, 10, 15];
var r = arr.filter(function (x) {
return x % 2 !== 0;
});
r; // [1, 5, 9, 15]//筛选掉偶数
廖大出了一个一道题目,用filter()
函数筛选素数:
//以下是解决方案,此方案参考了廖大教程下方的一位同学的算法
//思路是从2开始直到element-1之前一直让element对i取余,如果结果为零说明被除1和自身之外的其他数整除,则这样的数字return false被排除即可,最后一句return element!=1可以排除1这个数字本身。
'use strict';
function get_primes(arr) {
return arr.filter(function(element,index,self){
for(var i = 2;i<element - 1;i++){
if(element % i === 0){return false};
}
return element !=1;
}
)}
// 测试:
var
x,
r,
arr = [];
for (x = 1; x < 100; x++) {
arr.push(x);
}
r = get_primes(arr);
if (r.toString() === [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97].toString()) {
alert('测试通过!');
} else {
alert('测试失败: ' + r.toString());
}
2. sort()函数
sort()
函数廖大的教程中没有练习题,不过仔细阅读了廖大的教程之后有几个特别的点要自己注意。sort()
函数的排序是统一转换成String之后按照ASCLL码值进行排序的。所以在使用sort()
函数的时候尽量不要直接使用sort()
函数进行排序,因为sort()
函数也是高阶函数,也就意味着其可以接受函数作为参数,那么在使用sort()
函数的时候可以将自己的排序规则写进sort()
函数的参数中来实现自己独特的排序。下一个例子是廖大的我觉得比较经典的一个例子:
/*下面的方法是将arr进行排序,sort()中的参数function的作用是将所有的字符串全部变成大写,然后在使用sort()进行统一的
排序,这样就可以避免大小写造成的ASCLL码值比较的时候产生的意外情况*/
var arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
x1 = s1.toUpperCase();
x2 = s2.toUpperCase();
if (x1 < x2) {
return -1;
}
if (x1 > x2) {
return 1;
}
return 0;
}); // ['apple', 'Google', 'Microsoft']