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 ...
随机推荐
- Mysql根据出生日期计算年龄五种方法比较
方法一 SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age 方法一缺陷,就是当日期为未来日期时 ...
- HTML 画布(摘自菜鸟教程)
颜色.样式和阴影 属性 描述 fillStyle 设置或返回用于填充绘画的颜色.渐变或模式. strokeStyle 设置或返回用于笔触的颜色.渐变或模式. shadowColor 设置或返回用于阴影 ...
- 洛谷 P1070 道路游戏 DP
P1070 道路游戏 题意: 有一个环,环上有n个工厂,每个工厂可以生产价格为x的零钱收割机器人,每个机器人在购买后可以沿着环最多走p条边,一秒走一条,每条边不同时间上出现的金币是不同的,问如何安排购 ...
- poj1273 Drainage Ditches (最大流板子
网络流一直没学,来学一波网络流. https://vjudge.net/problem/POJ-1273 题意:给定点数,边数,源点,汇点,每条边容量,求最大流. 解法:EK或dinic. EK:每次 ...
- 牛客网暑期ACM多校训练营(第二场) I Car 思维
链接:https://www.nowcoder.com/acm/contest/140/I来源:牛客网 White Cloud has a square of n*n from (1,1) to (n ...
- Oil Deposits UVA - 572
The GeoSurvComp geologic survey company is responsible for detecting underground oil deposits. GeoSu ...
- CodeForces 917A The Monster 贪心+思维
As Will is stuck in the Upside Down, he can still communicate with his mom, Joyce, through the Chris ...
- Leetcode:合并两个有序链表
class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null) { return ...
- BigDecimal转String
代码: public static void main(String[] args) { // 浮点数的打印 System.out.println(new BigDecimal("10000 ...
- 通过Service访问应用 (2)
目录 通过NodePort Service在外部访问集群应用 通过LoadBalancer Service在外部访问集群应用 Microsoft SQL Server数据库部署 为了便于理解和学习,请 ...