资讯专栏INFORMATION COLUMN

数组方法之sort()详解

daryl / 1890人阅读

摘要:大家都知道,在的数组方法中,有一个方法,可以直接调用对数组进行排序。例如输出在默认情况下,会按照升序排列数组项,需要注意的是方法会改变原来的数组。注意即使数组中的每一项都是数字,方法比较的也是字串。

大家都知道,在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;//ab返回正数,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;
//ab返回正数,a在b的后面。=>比较大在后面
(2)return b - a;
//ba返回正数,b在a的后面。=>比较小在后面

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/90967.html

相关文章

  • js数组详解

    摘要:将对原来的数组进行反转,并返回改变后的数组,其会改变原数组的值。一个参数时返回该参数指定的位置到当前数组末尾的所有项。对数组的每一项运行给定的函数,没有返回值。测试有过滤筛选的含义,接收一个有返回值为弱的函数,最后返回一个过滤后的新数组。 数组初认识 Array是js中的引用数据类型,除了Object外,Array几乎是ECMAScript中最常用的数据类型了。 js中的数组与其他语言...

    dmlllll 评论0 收藏0
  • 详解数组(Array)引用类型

    摘要:例如,会删除数组中的前两项。插入的项数不必与删除的项数相等。这两个方法都接收两个参数要查找的项和可选的表示查找起点位置的索引。对数组中的每一项运行给定函数,返回每次函数调用的结果组成的数组。 除Object类型外,Array是最常用的类型,Array对象与其他语言相比有着自己的不同之处,首先同一数组对象的不同项可以保存不同类型的数据,其次数组对象的长短可以动态改变. showImg(...

    afishhhhh 评论0 收藏0
  • JavaScript中的Array.prototype.sort方法详解

    摘要:方法可以接受一个可选的参数,比较回调函数。方法会修改原本数组输出如上,在调用方法后,自身数组被修改。对于长数组会使用快速排序,而快速排序一般是不稳定的。所以方法返回的数组永远是该方法认为的升序数组。 前几天在某公司面试的时候被问到关于这个方法的默认值的问题(然而面试官跟我说的其实是错的,当场我还不够底气去反驳)。突然发现对这个方法的了解还不够,因此回来查了资料,看了v8引擎的实现和EC...

    Snailclimb 评论0 收藏0
  • 以❤️简单易懂❤️的语言带你搞懂有监督学习算法【附Python代码详解】机器学习系列KNN篇

    必须要看的前言 本文风格:以❤️简单易懂❤️的语言带你彻底搞懂KNN,了解什么是有监督学习算法。 认真看完这篇文章,彻底了解KNN、了解监督学习算法绝对是一样很简单的事情。 注:本篇文章非常详细,同时我也附加了Python代码,欢迎收藏后慢慢阅读。 目录 必须要看的前言监督学习算法KNN/K近邻算法1 算法原理1.1 实现过程1.2 距离的确定 2 算法的优缺点3 算法的变种3.1 变...

    MoAir 评论0 收藏0
  • JavaScript-原生Array对象方法详解(一)

    摘要:元素是通过指定的分隔符进行分隔的。注意该方法会改变原来的数组当不带参数调用时,数组元素按照字母表排序必要时临时转换为字符串比较。方法用于删除并返回数组的最后一个元素。如果数组已经为空,则不改变数组,并返回值。返回值的本地字符串表示。 1、join() join() 方法用于把数组中的所有元素转换为一个字符串。元素是通过指定的分隔符进行分隔的。arrayObject.join(separ...

    ls0609 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<