大家都知道,在JS的数组方法中,有一个sort()方法,可以直接调用对数组进行排序。例如:
var arr1=[1,5,8,9,7,2];arr1.sort();console.log(arr1);// 输出: [1,2,5,7,8,9]
在默认情况下,sort()会按照升序排列数组项,需要注意的是sort()方法会改变原来的数组。
sort()方法实现排序的原理:sort()方法会调用每一个数组项的toString()转型方法,然后比较得到的字符串(字符串的比较规则会在下文中讲到),以决定如何排序。注意即使数组中的每一项都是数字,sort()方法比较的也是字串。var arr2=[1,15,8,9,7,2];arr2.sort();console.log(arr2);// 输出: [1,15,2,7,8,9]
注意:15明明比2要大,却排在了2的前面,这就是sort()方法调用每一个数组项的toString(),然后比较得到的字符串造成的。
实现理想的的排序:为了避免上述情况,我们可以向sort()中传入一个比较函数,根据比较函数的返回值决定是升序排列还是降序排列。比较函数接收两个参数:如果第一个参数应该位于第二个参数之前则返回一个负数,如果两个参数相等,则返回0,否则返回一个正数。//compare()函数是升序的一种写法:function compare(value1,value2){ if(value1
对于数值类型或者其valueOf()方法会返回数值类型的对象类型,可以使用一个更简单的比较函数。
//从小到大排列 var arr4=[1, 4, 3]; arr4.sort(function(a, b) { return a - b;//a b返回正数,a在b的后面。=》比较大在后面 }); console.log(arr4); // 输出: [1, 3, 4]//从大到小排列 var arr5=[1, 4, 3]; arr5.sort(function(a, b) { return b - a; }); console.log(arr5); // 输出: [4, 3, 1]
由于比较函数通过返回一个小于零,等于零或大于零的值来影响排序,因此减法操作就可以适当的处理所有这些情况。
字符串比较规则:比较的时候,从字符串左边开始,一次比较每个字符,直接出现差异、或者其中一个串结束为止。比如ABC与ACDE比较,第一个字符相同,继续比较第二个字符,由于第二个字符是后面一个串大,所以不再继续比较,结果就是后面个串大。再如ABC与ABC123比较,比较三个字符后第一个串结束,所以就是后面一个串大。所以,长度不能直接决定大小,字符串的大小是由左边开始最前面的字符决定的。
这里比较坑的是笔者竟然对如何通过返回值来实现升序和降序想不明白了,后来经过分析终于理解了。大神们可以自行略过.
思考过程如下。(1)return a - b;//a b返回正数,a在b的后面。=>比较大在后面(2)return b - a;//b a返回正数,b在a的后面。=>比较小在后面