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排序
排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素x
和y
,如果认为x < y
,则返回-1
,如果认为x == y
,则返回0
,如果认为x > y
,则返回1
,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。
JavaScript的Array
的sort()
方法就是用于排序的,但是排序结果可能让你大吃一惊:
// 看上去正常的结果:
['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码在大写字母之后。
第三个排序结果是什么鬼?简单的数字排序都能错?
这是因为Array
的sort()
方法默认把所有元素先转换为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]
对象数组排序 一般是按照对象的一个字段或多个字段排序