建议11:增强数组排序的sort功能
sort方法不仅按字母顺序进行排序,还可以根据其他顺序执行操作.这时就必须为方法提供一个比较函数的参数,该函数要比较两个值,然后返回一个用于说明这两个值得相对顺序的数字.比较函数应该具有两个参数a和b,其返回值如下:
- 如果根据自定义评判标准,a小于b,在排序后的数组中a应该出现在b之前,就返回一个小于0的值
- 如果a等于b,就返回0
- 如果a大于b,就返回一个大于0的值
下面的示例中,将根据比较函数来比较数组中每个元素的大小,并按从小到大顺序排序
function f(a,b){ return (a-b) } var a = [4,3,5,6,7,3,6,8] a.sort(f) console.log(a); //[3, 3, 4, 5, 6, 6, 7, 8]
如果是从大到小,则让返回值取反就好
function f(a,b){ return -(a-b) } var a = [4,3,5,6,7,3,6,8] a.sort(f) console.log(a); //[8, 7, 6, 6, 5, 4, 3, 3]
(1) 根据奇偶性值排列数组
sort方法用法比较灵活,但更灵活的是对比较函数的设计.例如:要根据奇偶数顺序排列数组,只需要判断比较函数中两个参数是否为奇偶数,并决定排列顺序
function f(a,b){ var a = a%2 var b = b%2 if(a==0) return 1 if(b==0) return -1 } var a = [3,1,2,4,5,7,6,8,0,9] a.sort(f) console.log(a); //[3, 1, 5, 7, 9, 0, 8, 6, 4, 2]
sort方法在调用比较函数时,将每个元素值传递给比较函数,如果元素值为偶数,则保留其位置不动,如果元素值为奇数,则调换参数a和b的显示顺序,从而实现数组中所有元素执行奇偶排序.
(2) 不区分大小写排序字符串
如果不希望区分字母大小,也就是说大写字母和小写字母按相同顺序排列
function f(a,b){ var a = a.toLowerCase; var b= b.toLowerCase; if(a<b){ return 1 }else{ return -1 } } var a = ['aB','Ab','Ba','bA'] a.sort(f) console.log(a); // ["aB", "Ab", "Ba", "bA"]
(3) 把浮点数和整数分开排列
function f(a,b){ if(a>Math.floor(a)){ return 1 } if(b>Math.floor(b)){ return -1 } } var a = [3.555,3,2.111,5,7,3] a.sort(f) console.log(a); //[3, 5, 7, 3, 2.111, 3.555]