想用sort方法对数组排下序,代码如下:

 var nums = "12 645 6 85 81 0 9 365 4 752".split(" ").map(function(a){
return Number(a);
});
console.log(nums); // 排序前 [12, 645, 6, 85, 81, 0, 9, 365, 4, 752]
console.log(nums.sort()); // 排序后 [0, 12, 365, 4, 6, 645, 752, 81, 85, 9]

排序后的结果并不是预期的按照数值大小排列的,带着疑问去查了一下《JavaScript权威指南》,发现:

当不带参数调用sort()时,数组元素以字母表顺序排序(如有必要将临时转化为字符串进行比较)

原来默认都是以字符串形式比较的,接着又试验了两把:

 var words = "Lorem ipsum dolor sit amet consectetur adipisicing elit.".split(" ");
console.log(words); //["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipisicing", "elit."]
//只有字符串的情况
console.log(words.sort()); //["Lorem", "adipisicing", "amet", "consectetur", "dolor", "elit.", "ipsum", "sit"]
//数字和字符串的情况
var numAndWords = ["Lorem", "ipsum", "dolor", "sit", "amet", 12, 645, 6, 85, 81, 0];
console.log(numAndWords.sort()); //[0, 12, 6, 645, 81, 85, "Lorem", "amet", "dolor", "ipsum", "sit"]
//数字和部分以数字开头的字符串
numAndWords = ["Lorem", "2ipsum", "13dolor", "sit", "amet", 12, 645, 6, 85, 81, 0];
console.log(numAndWords.sort()); //[0, 12, "13dolor", "2ipsum", 6, 645, 81, 85, "Lorem", "amet", "sit"]

结果都符合预期,是按照ACSII码顺序进行比较的。如果想按照数值大小进行排序,该如何操作呢?这就用到了带参数的sort方法,参数可以是function,这样就能够按照自定义的方式排序了。

下面定义一个按照数值大小排序的方法:

 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
console.log(nums.sort(function(a, b){
if(a < b){
return -1;
}
else if (a > b) {
return 1;
}
else{
return 0;
}
})); //结果为:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]

根据《JavaScript权威指南》的说法:

给sort方法传递一个比较函数,该函数决定了它的两个参数在排好序的数组中的先后顺序:假设第一个参数应该在前,比较函数应该返回一个小于0的数值,反之,假设第一个参数应该在后,函数应该返回一个大于0的数值,并且,假设两个值相等,函数应该返回0。

但是如下比较函数返回大于0的数值时的测试有些意外:

 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
console.log(nums.sort(function (a, b) {
if (a < b) {
return 1;
}
})); //结果为:[12, 645, 6, 85, 81, 0, 9, 365, 4, 752]
nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
console.log(nums.sort(function (a, b) {
if (a > b) {
return 1;
}
})); //结果为:[12, 645, 6, 85, 81, 0, 9, 365, 4, 752]

接着继续测试比较函数返回小于0的数值时的情况:

 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
console.log(nums.sort(function (a, b) {
if (a < b) {
return -1;
}
})); //结果为:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]
nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
console.log(nums.sort(function (a, b) {
if (a > b) {
return -1;
}
})); //结果为:[752, 645, 365, 85, 81, 12, 9, 6, 4, 0]

只有比较函数返回值小于0时才会进行数组的排序。

《JavaScript权威指南》给出了一种简便的按照数值大小比较的方法:

 nums = [12, 645, 6, 85, 81, 0, 9, 365, 4, 752];
console.log(nums.sort(function(a, b){
return a - b;
})); //结果为:[0, 4, 6, 9, 12, 81, 85, 365, 645, 752]

以上是个人测试的结果,如有不对还请指教。

JS数组Sort方法的使用的更多相关文章

  1. js数组sort方法详解

    在处理数组的时候,我们有时候需要对数组进行排序,排序的方法有很多种,但是最好最快的就是利用sort方法进行快速的排序. 我们来看一个例子: var arr1 = [6, 3, 4, 1, 2, 5, ...

  2. js数组sort方法

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. 浅谈6种JS数组遍历方法的区别

    本篇文章给大家介绍一下6种JS数组遍历方法:for.foreach.for in.for of.. each. ().each的区别.有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助. ...

  4. JS高级面试题思路(装箱和拆箱、栈和堆、js中sort()方法、.js中Date对象中的getMounth() 需要注意的、开发中编码和解码使用场景有哪些)

    1.装箱和拆箱: 装箱:把基本数据类型转化为对应的引用数据类型的操作: var num = 123 // num var objNum = new Num(123) // object console ...

  5. js数组sort排序方法的算法

    说明一下,ECMAScript没有定义使用哪种排序算法,各个浏览器的实现方式会有不同.火狐中使用的是归并排序,下面是Chrome的sort排序算法的实现. sort方法源码 DEFINE_METHOD ...

  6. js数组的方法小结

    js中数组是一种非常常用数据结构,而且很容易模拟其他的一些数据结构,比如栈和队列.数组的原型Array.prototype内置了很多方法,下面就来小小总结一下这些方法. 检测数组就不用多说了,使用EC ...

  7. 再探JS数组原生方法—没想到你是这样的数组

    最近作死又去做了一遍javascript-puzzlers上的44道变态题,这些题号称"JS语言专业八级"的水准,建议可以去试试,这里我不去解析这44道题了, ...

  8. JS中sort()方法的用法,参数以及排序原理

    sort() 方法用于对数组的元素进行排序,并返回数组.默认排序顺序是根据字符串Unicode码点.语法:arrayObject.sort(sortby):参数sortby可选.规定排序顺序.必须是函 ...

  9. JS中sort()方法原理及使用

    说明 如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序.要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较. arra ...

随机推荐

  1. JavaMail技术实现邮件发送转【】

    1.导入2个jar包,mail.jar,activation.jar 2.导入的jar包与myeclipse中自带的javaee 中的javaee.jar中的javax.activation包及jav ...

  2. 从协议入手,剖析OAuth2.0(译 RFC 6749)

    1.介绍      https://tools.ietf.org/html/rfc6749  传统的client-server授权模型,客户端通过使用凭证(通常的用户名和明文密码)访问服务端受保护的资 ...

  3. Asp.Net Core中使用Swagger,你不得不踩的坑

    很久不来写blog了,换了新工作后很累,很忙.每天常态化加班到21点,偶尔还会到凌晨,加班很累,但这段时间,也确实学到了不少知识,今天这篇文章和大家分享一下:Asp.Net Core中使用Swagge ...

  4. Tomcat优化详解

    1          概述         本文档主要介绍了Tomcat的性能调优的原理和方法.可作为公司技术人员为客户Tomcat系统调优的技术指南,也可以提供给客户的技术人员作为他们性能调优的指导 ...

  5. Kubernetes(k8s)1.12.2集群搭建

    本博客搭建k8s集群1.12.2版本 1. 准备2台以上最低2核4G的服务器 2. 关闭机器的防火墙 12 systemctl disable firewalldsystemctl stop fire ...

  6. #Java学习之路——第一部分总结

    今天主要是Java的入门以及idea的安装说实话,没有什么有技术含量的东西,发的也全是皮毛,但是在数组部分有很多细节需要注意,在JDK环境变量配置的地方不光光只有windows 的环境配置,还要掌握补 ...

  7. PHP零基础入门

    字符函数库: 函数库基础 安装字符串函数库 字符串函数库列表 函数是可以实现特定功能,可以重复执行的代码段. 函数分 内置函数 和 用户函数. 内置函数是指PHP本身提供的各类库函数. 字符串函数库, ...

  8. [Swift]LeetCode221. 最大正方形 | Maximal Square

    Given a 2D binary matrix filled with 0's and 1's, find the largest square containing only 1's and re ...

  9. layui动态设置checkbox选中状态

    今天在使用jquery动态设置layui的checkbox元素的选中状态时始终只能取消选中,却不能重新勾选,点击勾选则没有问题,代码如下 if (value == "true") ...

  10. vue实例属性的方法

    1.$mount()   手动设置挂载点  eg:vm.$mount("#app") 2.$destroy()  销毁   eg:vm.$destroy(); 3.$forceUp ...