javascript学习笔记(11)--sort排序

排序是在程序中经常用到的算法
无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小
通常规定,对于两个元素x和y,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1

JavaScript的Array的sort()方法就是用于排序的
Array的sort()方法默认把所有元素先转换为String再排序,按照ASCII的大小,一位一位的进行比较,ASCII码大的排在后面,如果比到某一位没有了,那么没有的排在前面
这个原理还是挺好的,但在实际应用的时候会出现意料不到的结果

['Google', 'Apple', 'Microsoft'].sort();//Array(3) [ "Apple", "Google", "Microsoft" ]
['Google', 'apple', 'Microsoft'].sort();//Array(3) [ "Google", "Microsoft", "apple" ]
[10, 20, 1, 2].sort();//Array(4) [ 1, 10, 2, 20 ]

因为小写字母a的ASCII码在大写字母之后,所以第二个排序apple就排到了最后
第三个排序可能大家都难以想象,但这确实是按照上面的规则来的

 10>2
true
'10'>'2'
false

刚才提到了,sort调用之前会把所有的array元素转化为字符串,然后字符串的比较原理刚才也提到过…所以会造成…这么奇怪的结果

如果不了解sort()方法的默认排序规则,直接对数字排序,绝对栽进坑里

但sort()方法也是一个高阶函数,它可以接收一个比较函数来实现自定义的排序
那么这个比较函数要怎么写呢,其实又涉及到sort的原理
我在网上也找了很多资料,然后也自己测试了
发现firefox和node.js两个原则不太一样,而且差别很大…不试不知道,一试吓一跳

在firefox里面(记住sort会改变顺序,所以测试的时候要重新定义a,不然可能a的顺序改变了)

var a=[1,2,3,4]
a.sort(function (){return 1;})
Array(4) [ 4, 3, 2, 1 ]

a=[1,2,3,4];//Array(4) [ 1, 2, 3, 4 ]
a.sort(function (){return 3;})
Array(4) [ 4, 3, 2, 1 ]

a=[1,2,3,4];//Array(4) [ 1, 2, 3, 4 ]
a.sort(function (){return 0;})
Array(4) [ 1, 2, 3, 4 ]

a=[1,2,3,4];//Array(4) [ 1, 2, 3, 4 ]
a.sort(function (){return -1;})
Array(4) [ 1, 2, 3, 4 ]

a=[1,2,3,4];//Array(4) [ 1, 2, 3, 4 ]
a.sort(function (){return -3;})
Array(4) [ 1, 2, 3, 4 ]

可以发现sort()方法在接受到函数返回的1(准确的说是大于0的任意的数)时,就交换位置,如果接收到函数返回的-1(准确的说是小于0的任意数字)就保持顺序不变,如果返回是0就认为是一样的顺序,也保持不变

var a=[1,2,3,4]
a.sort(function(x,y){console.log(x,y);if(x<y)return -1;else if(x>y)return 1;else return 0;})
1 2 
2 3
3 4 
Array(4) [ 1, 2, 3, 4 ]

可以看出sort的原理,传入的两个参数,然后是依次比较相邻的两项,然后再看我们的算法
x<y,返回-1,就是不改变位置
x>y,返回1,就要交换位置
跟我们刚才说的也是一致的
在这里插入图片描述而在node.js里面,这个差别就大多了
首先是返回值的问题

 var a=[1,2,3,4]
> a.sort(function(){return 1;});//[ 1, 2, 3, 4 ]
> a=[1,2,3,4]
a.sort(function(){return 3;});//[ 1, 2, 3, 4 ] 
a=[1,2,3,4]  
 a.sort(function(){return 0;});//[ 1, 2, 3, 4 ]  
 a=[1,2,3,4]
 a.sort(function(){return -1;});//[ 4, 3, 2, 1 ] 
 a=[1,2,3,4]
 a.sort(function(){return -3;});//[ 4, 3, 2, 1 ]    

在node.js里sort()方法在接受到函数返回的-1(准确的说是小于0的任意的数)时,就交换位置,如果接收到函数返回的1(准确的说是大于0的任意数字)就保持顺序不变,如果返回是0就认为是一样的顺序,也保持不变

var a=[1,2,3,4]
a.sort(function(x,y){console.log(x,y);if(x<y)return -1;else if(x>y)return 1;else return 0;})
 console.log(a);
 D:\Node\node.exe main.js 
2 1
3 2
4 3
[ 1, 2, 3, 4 ]

不知道怎么想的,传入的参数顺序是反的,先是后面的那个,然后是前面的那个,虽然也是按着比较相邻两项
x<y,说明后面的小,就要返回-1交换位置
x>y说明后面大,就返回1不变
x=y,就返回0不变

不过怎么说呢,这种设计的好处就是兼容性的问题,本来两种算法是反的,但这么一折腾,又可以通用了…

关于这点我也弄了挺长时间…百思不得其解,最后才发现有这么大一个坑

所以以后遇到排序,就大胆写就好了,两种是等效的
从小往大

var arr = [10, 20, 1, 2]; 
arr.sort(function (x, y) {
 if (x < y) { return -1; }
 if (x > y) { return 1; }
 return 0; }); 

如果要从大到小排序,我们可以把大的数放前面:

var arr = [10, 20, 1, 2]; 
arr.sort(function (x, y) {
 if (x < y) { return 1; }
 if (x > y) { return -1; }
 return 0; }); 

但有时候我们需要忽略大小写现,按照字母序排序

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; });
 Array(3) [ "apple", "Google", "Microsoft" ]

忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较

最后友情提示,sort()方法会直接对Array进行修改,sort之后Array值就被修改了

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值