js 高阶函数

map

遍历Array数据进行操作后返回新数组

//计算平方
function square(a){
  return a * a;
}
var arr = [1,2,3,4,5,6];
var newArr = arr.map(square)
// newArr = [1,4,9,16,25,36]

parseInt 使用注意

var arr = [‘1‘,‘2‘,‘3‘];
var newArr = arr.map(parseInt)
// 结果为 [1,NaN,NaN]
// 原因是parseInt为两个参数  
// 第一个参数为要转换的字符串  
// 第二个参数为基数 表示要解析的数字的基数。该值介于 2 ~ 36 之间。
// 如果省略该参数或其值为 0,则数字将以 10 为基数来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
// 如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
// 所以实际调用结果为  parseInt(‘1‘,0)  parseInt(‘2‘,1)  parseInt(‘3‘,2)

解决方案

arr.map(Number)
//还可以把parseInt 在包装一层
function myParseInt(a){
    return parseInt(a);
}
arr.map(myParseInt)

 

reduce

Array这个函数 必须接收两个参数,reduce()把结果继续和序列的下一个元素做累积计算

var arr = [1,2,3,4,5];
function plus(a,b){
    return a + b;
}
//需要接收两个参数的函数
var result = arr.reduce(plus)
// 计算得到result等于15 
//arr.reduce(plus) = plus(plus(plus(plus(1,2),3),4),5)

filter

Array的某些元素过滤掉,然后返回剩下的元素

var arr = [1,2,3,4,5,6];
var newArr = arr.filter((element,index,self) => {
  //element 元素
  //index  索引
  //self  就是arr数组
  //返回ture 则保留元素  false则删除元素
  return if(element % 2 === 0)
});
// 结果 newArr = [2,4,6]

sort

给Array排序

排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素xy,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

JavaScript的Arraysort()方法就是用于排序的,但是排序结果可能让你大吃一惊:

// 看上去正常的结果:
[‘Google‘, ‘Apple‘, ‘Microsoft‘].sort(); // [‘Apple‘, ‘Google‘, ‘Microsoft‘];

// apple排在了最后:
[‘Google‘, ‘apple‘, ‘Microsoft‘].sort(); // [‘Google‘, ‘Microsoft", ‘apple‘]

// 无法理解的结果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

第二个排序把apple排在了最后,是因为字符串根据ASCII码进行排序,而小写字母a的ASCII码在大写字母之后。

第三个排序结果是什么鬼?简单的数字排序都能错?

这是因为Arraysort()方法默认把所有元素先转换为String再排序,结果‘10‘排在了‘2‘的前面,因为字符‘1‘比字符‘2‘的ASCII码小。

 

数字数组排序

var arr = [100,50,73,7,1,10,63]
arr.sort(function (x, y) {
    if (x < y) {
        return -1;
    }
    if (x > y) {
        return 1;
    }
    return 0;
});
// 注意排序会改变原数组 console.log(arr);
// [1,7,10,50,63,73,100]

对象数组排序 一般是按照对象的一个字段或多个字段排序

 

js 高阶函数

上一篇:Vue实现前端裁剪(elementUI上传+vueCropper实现)


下一篇:Angular 使用 Rxjs 实现Url的监控与修改