数组要领之sort()详解

人人都晓得,在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<value2){
        return -1;
    }else if(value1==value2){
        return 0;
    }else{
        return 1;
    }
}
var arr3=[1,15,8,9,7,2];
arr3.sort(compare);
console.log(arr3);
// 输出: [1,2,7,8,9,15]

关于数值范例或许其valueOf()要领会返回数值范例的对象范例,能够运用一个更简朴的比较函数。

//从小到大分列
    var arr4=[1, 4, 3];
    arr4.sort(function(a, b) {
        return a - b;//a<b返回负数,b在a的背面;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返回负数,b在a的背面;a>b返回正数,a在b的背面。=>比较大在背面
(2)return b - a;
//b<a返回负数,a在b的背面;b>a返回正数,b在a的背面。=>比较小在背面
    原文作者:specialCoder
    原文地址: https://segmentfault.com/a/1190000006881722
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞