JS实现数组排序的方法
前言
排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列,当然排序也是算法中的一种,javascript内置的sort函数是多种排序算法的集合,数组在原数组上进行排序。JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。
I.简单排序
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单排序</title>
</head>
<body>
<script type="text/javascript">
var numbers=[4,6,8,0,1,2,3,7,9];
numbers.sort();//调用数组内置排序方法
console.log(numbers);//0,1,2,3,4,6,7,8,9
numbers.reverse();//将数组进行反转
console.log(numbers);//9,8,7,6,4,3,2,1,0
</script>
</body>
</html>

虽说我们实现了排序,也达到了我们想要的结果,但是这种排序有问题,我们看下下面这个例子
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单排序</title>
</head>
<body>
<script type="text/javascript">
var numbers=[4,6,8,0,1,2,3,7,9];
numbers.sort();//调用数组内置排序方法
console.log(numbers);//0,1,2,3,4,6,7,8,9
numbers.reverse();//将数组进行反转
console.log(numbers);//9,8,7,6,4,3,2,1,0 var num=[0,1,5,10,15];
num.sort();//调用数组内置的排序方法
console.log(num);//0,1,10,15,5
num.reverse();//调用数组内置的反转方法
console.log(num);//5,15,10,1,0
</script>
</body>
</html>

为什么呢?且听我一一道来,本身sort()这个方法是没有问题的,在默认情况下,sort()方法按升序排列数组项,即最小的值位于最前面,最大的值排在最后面。为了实现升序,sort()方法会调用每个数组项的toString()转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值,sort()方法比较的也是字符串。为了更好的实现排序,sort()方法可以接收一个比较函数作为参数,以便我们指定哪个值位于那个值的前面,我们看下下面的案例。
II.简单数组自定义排序
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单数组自定义排序</title>
</head>
<body>
<script type="text/javascript">
var number=[0,1,10,15,5];
function arrAsc(a,b){ //实现数组升序的方法
if(a>b){
return 1;
}else if(a<b){
return -1;
}else{
return 0;
}
}
number.sort(arrAsc);//调用数组升序的方法
console.log(number);//0.1,5,10,15
function arrDesc(a,b){ //实现数组降序的方法
if(a>b){
return -1;
}else if(a<b){
return 1;
}else{
return 0;
}
}
number.sort(arrDesc);//调用数组降序的方法
console.log(number);//15,10,5,1,0 </script>
</body>
</html>

在这里我们定义了一个compare比较函数,当a>b的结果为整数时则为升序,当a>b的结果为负数时则为降序。
III.简单对象自定义属性排序
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>简单对象自定义属性排序</title>
</head>
<body>
<script type="text/javascript">
var friuts=[
{
name:'apple',
price:18.5,
count:10
},
{
name:'pear',
price:1.5,
count:5,
},
{
name:'banana',
price:20.5,
count:20
},
]
console.log(JSON.stringify(friuts));//未排序前
//按价格升序排序
friuts.sort(function(x,y){
return x.price-y.price;
});
console.log(JSON.stringify(friuts));
//按名称排序
friuts.sort(function(x,y){
if(x.name>y.name){
return 1;
}else if(x.name<y.name){
return -1;
}else{
return 0;
}
});
console.log(JSON.stringify(friuts));
</script>
</body>
</html>

IV.通用的排序方法
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>通用的排序方法</title>
</head>
<body>
<script type="text/javascript">
var friuts=[
{
name:'apple',
price:18.5,
count:10
},
{
name:'pear',
price:1.5,
count:5,
},
{
name:'banana',
price:20.5,
count:20
},
]
var sortExp=function(key,isAsc){
return function(x,y){
if(isNaN(key)){
if(x[key]>y[key]){
return 1*(isAsc?1:-1); }else if(x[key]<y[key]){
return -1*(isAsc?1:-1);
}else{
return 0;
} }else{
return (x[key]-y[key])*(isAsc?1:-1)
}
}
}
//价格升序
friuts.sort(sortExp('price',true));
console.log(JSON.stringify(friuts));
//价格降序
friuts.sort(sortExp('price',false));
console.log(JSON.stringify(friuts));
//名称升序
friuts.sort(sortExp('name',true));
console.log(JSON.stringify(friuts));
//名称降序
friuts.sort(sortExp('name',false));
console.log(JSON.stringify(friuts));
//数量升序
friuts.sort(sortExp('count',true));
console.log(JSON.stringify(friuts));
//数量降序
friuts.sort(sortExp('count',false));
console.log(JSON.stringify(friuts)); </script>
</body>
</html>

JS实现数组排序的方法的更多相关文章
- js多种去重的方法总结
第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存到结果数组中 Array.pro ...
- 由js apply与call方法想到的js数据类型(原始类型和引用类型)
原文地址:由js apply与call方法想到的js数据类型(原始类型和引用类型) js的call方法与apply方法的区别在于第二个参数的不同,他们都有2个参数,第一个为对象(即需要用对象a继承b, ...
- iOS之在webView中引入本地html,image,js,css文件的方法 - sky//////////////////////////////////////ZZZZZZZZZZZZZZZ
iOS之在webView中引入本地html,image,js,css文件的方法 2014-12-08 20:00:16CSDN-sky_2016-点击数:10292 项目需求 最近开发的项 ...
- 原生js获取鼠标坐标方法全面讲解-zmq
原生js获取鼠标坐标方法全面讲解:clientX/Y,pageX/Y,offsetX/Y,layerX/Y,screenX/Y 一.关于js鼠标事件综合各大浏览器能获取到坐标的属性总共以下五种:eve ...
- js巧用apply方法实现数组最值以及合并
尽管js的apply方法在平常的使用中并不多见,但是在某些地方使用的还是很有帮助性的,这里就和大家说两个比较实用的例子:1.数组最大最小值 求数组中的最大最小值,js有相应的方法:Math.min() ...
- <js>实现回车键登陆方法,并处理谷歌与火狐不兼容的问题
1.在body中添加onkeydown事件 <body onkeydown="keyLogin(event);">2.使用js相应登陆添加方法//添加回车登陆事件 fu ...
- js中的tostring()方法
http://blog.sina.com.cn/s/blog_85c1dc100101bxgg.html js中的tostring()方法 (2013-11-12 11:07:43) 转载▼ 标签: ...
- js跳转页面方法大全
js跳转页面方法大全<span id="tiao">3</span><a href="javascript:countDown"& ...
- 常见JS(JavaScript)冲突解决方法
1.一般JS冲突解决办法 a.最容易出现的就是js的命名冲突 ①.变量名冲突 变量有全局变量和局部变量当全局变量变量和局部变量名称一致时,就会js冲突,由于变量传递数值或地址不同就会产生JavaScr ...
随机推荐
- python控制窗口对角线运动
import win32con import win32gui import time while True: time.sleep(1) notepad = win32gui.FindWindow( ...
- CODE[VS] 1294 全排列
1294 全排列 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 给出一个n, 请输出n的所有全 ...
- 几个Python爬虫工具介绍
Request Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用 上面一句话 出自Requests官方文档的第一句,从而奠定了其逗逼的文档风格.类似的还有: 警告: ...
- mariadb 远程访问报:Host xxx is not allowed to connect to this MariaDb server
刚开始试的是: 结果报错了,哎,这折腾的. 继续折腾,加个密码试试: 再用Navicat试试,果然成功了.
- debug 模式缓慢
debug 模式启动服务器,然后在 breakopints下可以看到打的断点.清除全部重启服务器,问题解决.
- MyBatis的发展和选型
xlecho编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!! 参考 ...
- 实验吧CTF练习题---WEB---头有点大解析
实验吧web之头有点大 地址:http://www.shiyanbar.com/ctf/29 flag值:HTTpH34der 解题步骤: 1.进入解题界面,看提示 2.说提示很多,再提示 ...
- 简单说一下你对http和https的理解
http是一种超文本传输协议,传输的数据都是未加密的,也就是显示在明面上的,是现在互联网上应用最为广泛的一种网络协议,相对来说不太安全,但是所需成本很小.http一般的端口号为80. https则是具 ...
- Java反序列化漏洞原理解析(案例未完善后续补充)
序列化与反序列化 序列化用途:方便于对象在网络中的传输和存储 java的反序列化 序列化就是将对象转换为流,利于储存和传输的格式 反序列化与序列化相反,将流转换为对象 例如:json序列化.XML序列 ...
- SpringCloud(四)Hystrix熔断器
前面已经学习了服务注册与发现组件,负载均衡组件,这样我们的微服务系统已经可以使用了.为了保证其高可用,单个服务通常会集群部署.由于网络原因或者自身的原因,服务并不能保证 100% 可用,如果单个服务出 ...