js笔记03-高阶函数
2017-12-27 本文已影响4人
大飞哥
高阶函数
function add(x, y, f) {
return f(x) + f(y);
}
这样就可以调用add(-5, 6, Math.abs)
map/reduce
map
map()
方法定义在JavaScript的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]
console.log(results); //1,4,9,16,25,36,49,64,81
reduce
Array
的reduce()
把一个函数作用在这个Array
的[x1, x2, x3...]
上,这个函数必须接收两个参数,reduce()
把结果继续和序列的下一个元素做累积计算,其效果就是:
[x1, x2, x3, x4].reduce(f) = f(f(f(x1, x2), x3), x4)
要把[1, 3, 5, 7, 9]
变换成整数13579
,reduce()也能派上用场:
//注意函数定义的方法
var arr = [1, 3, 5, 7, 9];
arr.reduce(function (x, y) {
return x * 10 + y;
}); // 13579
var arr = ['1', '2', '3'];
var r;
r = arr.map(parseInt);
console.log(r);//给出的结果是 1, NaN, NaN ???
因为:
parseInt(string, radix)
其实parseInt是由两个参数的.parseInt(string, radix)
参数 | 描述 |
---|---|
string | 必需。要被解析的字符串。 |
radix | 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。 |
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
然后map是可以有三个参数的
arr.map(function callback(currentValue[, index[, array]])
第一参数value
,数组元素的值;第二个参数index
,数组元素的数组索引;array,包含该元素的数组对象。
所以arr.map(parseInt);
[parseInt(1,0),parseInt(2,1),parseInt(3,2)]
参考
filter
Array
的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()
有三个参数
var arr = ['A', 'B', 'C'];
var r = arr.filter(function (element, index, self) {
console.log(element); // 依次打印'A', 'B', 'C'
console.log(index); // 依次打印0, 1, 2
console.log(self); // self就是变量arr
return true;
});
sort
sort()
方法默认把所有元素先转换为String
再排序,所以
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]
数字大小排序
var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
if (x < y) {
return -1; //返回-1,则不需要交换
}
if (x > y) {
return 1; //返回1,则需要交换
}
return 0;
});
console.log(arr); // [1, 2, 10, 20]
最后,sort()
方法会直接对Array进行修改,它返回的结果仍是当前Array