资讯专栏INFORMATION COLUMN

JavaScript sort() 排序的坑详解

ispring / 1288人阅读

摘要:前言做项目的时候发现使用排序后的代码,在和平台解析的结果不一样。而根据规范,通过可以推测出,显然这里互相矛盾反之亦然的情况。

前言:做项目的时候发现使用sort排序后的代码,在android和ios平台解析的结果不一样。

1、先从简单的开始,大家都知道sort()函数比较的是ASCII码的大小,而且而且而且:Array的sort()方法默认把所有元素先转换为String再排序,所以就有以下问题。

// baiDu排在了最后:
["Google", "baiDu", "Facebook"].sort(); // ["Facebook", "Google", "baiDu"]

// 无法理解的结果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

结果转换成字符串比较,"10"排在了"2"的前面,因为字符"1"比字符"2"的ASCII码小

2、使用回调函数的错误

[10, 2, 3, 100, 6, 9].sort((a, b) => {
    return a < b;
});
// 无法理解的结果
[10, 2, 3, 100, 6, 9]

排序前后结果没有变化

问题分析:
在sort实现的规范中有这么一条 sortFun(a,b) === 0,则有 a === b 且 b === a 。
此时我们再看var sortFun = (a, b) => a < b,它等同于var sortFun = (a, b) => a < b ? 1 : 0。

它有一个隐藏的漏洞:当a >= b时,sortFun(a,b) === 0。而根据规范,通过sortFun(a,b) === 0可以推测出a === b,显然这里互相矛盾, 反之亦然(a > b的情况)。

所以比较的时候最好使用 a - b 或者 b - a

正确写法:

[10, 2, 3, 100, 6, 9].sort((a, b) => {
    return a - b;
});
// 结果
[2, 3, 6, 9, 10, 100]

android 和 ios平台解析的sort函数实现方式不同,不规范的写法可能导致解析结果不同

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

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

相关文章

  • JavaScript中的Array.prototype.sort方法详解

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

    Snailclimb 评论0 收藏0
  • JS 中 Array.sort 的那些事儿

    摘要:然而有时候的结果和预期结果还是有些差异的。中文的可以通过来获取。啊次比例中毓比侊啊比侊比例次毓中当然和允许传入参数指定,有兴趣的可以去上看看用法。对于中文或者需要本地化比较的场景下,可以使用或者来进行比较。 大家都知道 js 自带了一个排序方法 sort,很多时候需要排序的时候也都直接使用了 sort 方法来排序。然而有时候 sort 的结果和预期结果还是有些差异的。 看下面的代码 [...

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

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

    ls0609 评论0 收藏0
  • 【JS必知必会】高阶函数详解与实战

    摘要:函数作为参数情况,,和是中内置的高阶函数。知道了到底啊什么是高阶函数,有哪些类型的高阶函数。公众号技术栈路线大家好,我是,公众号程序员成长指北作者,这篇文章是必知必会系列的高阶函数讲解。 前言 一道经典面试题: //JS实现一个无限累加的add函数 add(1) //1 add(1)(2) //3 add(1)(2)(3) //6 当大家看到这个面试题的时候,能否在第一时间想到...

    李昌杰 评论0 收藏0
  • 记数组sort方法与字符串比较引起的Bug

    摘要:发现的问题是字符串比较引起的。而在第二版的返回值是与,对应的是和。字符串比较是一个一个字符进行比较中方法的比较函数返回值正值,负值,的含义 前言 前几天使用JavaScript中Array的sort排序字符串,发现排序不准确,这里记一下。 第一版 var arr = [0, 1, 11, 11, 2, 12, 123, 123, 333, 5]; // 第一个版本 arr.sort(...

    wendux 评论0 收藏0

发表评论

0条评论

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