javascript中sort()排序的一些理解
sort()方法对一个数组进行排序,并可以接受一个比较函数,最后返回一个排序的数组。
1.sort()有自身默认的比较函数,该函数把排序的元素都看作字符串。
var s = [5, 4, 3, 2, 1];
s.sort();
console.log(s);
//=>[ 1, 2, 3, 4, 5 ]
改变排序数组:
var s = [2, 4, 5, 1, 12, 3, 13];
s.sort();
console.log(s);
//=>[ 1, 12, 13, 2, 3, 4, 5 ]
明显地,大多数情况下sort()方法不能得到理想排序的数组。但是,可以通过为sort()方法传入不同的比较函数,以得到合适的排序结果。
2.为sort()方法传入新的比较函数。
var s = [2, 4, 5, 1, 12, 3, 13];
s.sort(function(a, b) {
return a - b;
});
console.log(s);
//=>[ 1, 2, 3, 4, 5, 12, 13 ]
其中,比较函数接受两个参数a,b。当比较函数返回0时,表示a=b;返回正数时,表示a>b;返回负数时,表示a<b。
当然,以下方式也有相同的效果:
var s = [2, 4, 5, 1, 12, 3, 13];
s.sort(function(a, b) {
if(a == b)
return 0;
else
return a < b ? -1 : 1;
});
console.log(s);
//=>[ 1, 2, 3, 4, 5, 12, 13 ]
再次改变排序数组,其包含不止一种数据:
var s = [2, 4, 5, 'b', 1, 'a', 12, 3, 13];
s.sort(function(a, b) {
return a - b;
});
console.log(s);
//=>[ 2, 4, 5, 'b', 1, 'a', 3, 12, 13 ]
数组再次变得杂乱无章,因此,可以再修改比较函数,以达到预期效果。
3.使sort()适用于简单数据类型的数组排序。
var s = [2, 4, 5, 'b', 1, 'a', 12, 3, 13];
s.sort(function(a, b) {
if(a === b)
return 0;
if(typeof a === typeof b) //当数据类型相同时,判断先后位置
return a < b ? -1 : 1;
return typeof a < typeof b ? -1 : 1; //确定不同类型数据的先后顺序,此例为Number在前,String在后
});
console.log(s);
//=>[ 1, 2, 3, 4, 5, 12, 13, 'a', 'b' ]
由本例可知,可先对传入参数进行类型判断,再进行排序,即可以得到一定排序方式的结果。
同样地,通过比较函数,我们可以对对象数组进行排序。
4.用sort()方法排序对象数组。
var s = [
{'year': 1993, 'sex': 'man', 'name': '张三'},
{'year': 1992, 'sex': 'woman', 'name': '李红'},
{'year': 1991, 'sex': 'man', 'name': '赵四'},
{'year': 1993, 'sex': 'woman', 'name': '吴用'}
];
var byRule = function(rule) {
return function(a, b) {
var i, j;
if(typeof a === 'object' && typeof b === 'object') {
i = a[rule];
j = b[rule];
if(i === j)
return 0;
if(typeof i === typeof j) {
return i < j ? -1 : 1;
}
return typeof i < typeof j ? -1 : 1;
}
};
};
s.sort(byRule('year'));
console.log(s);
//=>[ { year: 1991, sex: 'man', name: '赵四' },
{ year: 1992, sex: 'woman', name: '李红' },
{ year: 1993, sex: 'man', name: '张三' },
{ year: 1993, sex: 'woman', name: '吴用' } ]
先定义了一个函数byRule,该函数返回一个排序函数,从而可以通过传入不同的排序规则至byRule函数来得到不同的排序函数。
观察26,27行代码,其中year相同:
26 { year: 1993, sex: 'man', name: '张三' },
27 { year: 1993, sex: 'woman', name: '吴用' } ]
可以再对byRule函数添加一个参数,使得第一个键值已派序时,对相同的元素进行下一个键值对的排序:
var s = [
{'year': 1993, 'sex': 'man', 'name': '张三'},
{'year': 1992, 'sex': 'woman', 'name': '李红'},
{'year': 1991, 'sex': 'man', 'name': '赵四'},
{'year': 1993, 'sex': 'woman', 'name': '吴用'}
];
var byRule = function(rule, next) {
return function(a, b) {
var i, j;
if(typeof a === 'object' && typeof b === 'object') {
i = a[rule];
j = b[rule];
if(i === j)
return typeof next === 'function' ? next(a, b) : 0 ; //第一对键值相同时,继续比较第二对键值
if(typeof i === typeof j) {
return i < j ? -1 : 1;
}
return typeof i < typeof j ? -1 : 1;
}
};
};
s.sort(byRule('year', byRule('name'))); //byRule函数接受两个参数,第二个参数为一个函数
console.log(s);
//=>[ { year: 1991, sex: 'man', name: '赵四' },
{ year: 1992, sex: 'woman', name: '李红' },
{ year: 1993, sex: 'woman', name: '吴用' },
{ year: 1993, sex: 'man', name: '张三' } ]
与上例对比,26,27行的顺序已改变。
5.讨论一下sort()的排序方式。
本例测试在sublime text 3 中进行。
- 当排序数组元素不大于10个时:
var s = [10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
s.sort(function(a, b) {
if(a == b) {
console.log(a + "=" + b);
return 0;
}
if(a < b) {
console.log(a + "<" + b);
return -1;
}
if(a > b) {
console.log(a + ">" + b);
return 1;
}
});
console.log(s);
结果:
10>9
10>8
9>8
10>7
9>7
8>7
10>6
9>6
8>6
7>6
10>5
9>5
8>5
7>5
6>5
10>4
9>4
8>4
7>4
6>4
5>4
10>3
9>3
8>3
7>3
6>3
5>3
4>3
10>2
9>2
8>2
7>2
6>2
5>2
4>2
3>2
10>1
9>1
8>1
7>1
6>1
5>1
4>1
3>1
2>1
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
可见,其排序方式为典型的插入排序。
- 当排序数组元素为11个(或11个以上)时:
var s = [11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1];
s.sort(function(a, b) {
if(a == b) {
console.log(a + "=" + b);
return 0;
}
if(a < b) {
console.log(a + "<" + b);
return -1;
}
if(a > b) {
console.log(a + ">" + b);
return 1;
}
});
console.log(s);
结果:
11>1
1<6
11>6
9>6
2<6
8>6
3<6
7>6
4<6
10>6
5<6
1<2
2<3
3<4
4<5
10>7
10>8
7<8
10>9
8<9
10<11
[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
可见,其排序方式为快速排序。
-------------------------------------------------------------------------------------------------------
注:本文为个人学习随笔,仅供个人学习使用,如有雷同,纯属巧合,敬请原谅!
javascript中sort()排序的一些理解的更多相关文章
- javascript 中合并排序算法 详解
javascript 中合并排序算法 详解 我会通过程序的执行过程来给大家合并排序是如何排序的... 合并排序代码如下: <script type="text/javascript& ...
- JavaScript中call、apply个人理解
JavaScript中call.apply个人理解 一句话即通俗的说:call.apply 是为了改变this的状态而存在的 }; } function personInfo(name,age){ t ...
- JavaScript中简单排序总结
JavaScript中简单排序总结 冒泡排序 经典排序算法, 双重for循环 在第二个for循环的时候, j < arr.len -1 -i , 这一步的优化很重要 function bullS ...
- STL中sort排序算法第三个参数_Compare的实现本质
关于C++ STL vector 中的sort排序算法有三种自定义实现,它们本质上都是返回bool类型,提供给sort函数作为第三个参数. 重载运算符 全局的比较函数 函数对象 我认为从实现方式看,重 ...
- 对JavaScript中变量类型的重新理解
<JavaScript启示录>这本书中提出:JavaScript中,对象为“王”(JavaScript里的几乎所有东西都是对象或者用起来像对象). 飞燕草对JavaScript最深刻的理解 ...
- javascript中闭包与作用域的理解
很多js的框架与插件编写都用到了闭包,所以,阅读和掌握闭包很有必要.最近学习vue框架时,经常会猜想很多功能的native js实现,很多都应用到了闭包,闭包除了目前已知的一些特性,如:可以保持局部变 ...
- javascript中对象字面量的理解
javascript中对象字面量与数组字面量 第一部分 我们知道JavaScript中的数据类型有基本数据类型和引用类型,其中Object类型就是非常常用的类型.那么如果创建一个Object类型的实例 ...
- JavaScript中一些怪异用法的理解
引言 JavaScript这门语言有些场合的用法还是比较怪异的.这篇文章会尽量将这门语言特有的一些比较特殊的用法收集在一起.就当是平时开发时需要注意的地方吧. 特殊用法收集 1.!!用法 在JavaS ...
- javascript 中的new操作符的理解
new 操作符 在有上面的基础概念的介绍之后,在加上new操作符,我们就能完成传统面向对象的class + new的方式创建对象,在Javascript中,我们将这类方式成为Pseudoclassic ...
随机推荐
- JavaScript String对象常用方法
length 返回字符串的长度(字符数) var str='Hello World!'; str.length; charAt() 返回指定位置的字符,第一个字符位置为0 var str='Hello ...
- electron之20190320
一.sudo npm i electron -g一直失败 最终解决办法:使用了sudo cnpm i electron -g安装成功 原因不详 二.打包问题 1.使用electron-packager ...
- eclipse插件开发常见的问题及解决办法
莫名其妙地我的某个Plug-in Projects出现了这样的Error:An API baseline has not been set for the current workspace.虽然后来 ...
- GeoServer中WMS、WFS的请求规范(转载)
1.背景 1.1WMS简介 Web地图服务(WMS)利用具有地理空间位置信息的数据制作地图.其中将地图定义为地理数据可视的表现.这个规范定义了三个操作:GetCapabitities返回服务级元数据, ...
- Windows API 编程-----Windows NT 环境下禁止任务切换
函数原型: BOOL WINAPI SystemParametersInfo( _In_ UINT uiAction, _In_ UINT uiParam, _Inout_ PVOID pvParam ...
- SiP封装成超越摩尔定律的要塞,日月光/安靠/长电科技谁将赢取IC封装的未来
来源:EEFOCUS 进入2017年,摩尔定律的脚步愈加沉重,"摩尔定律已死"的言论笼罩着整个半导体行业,超越摩尔定律发展的想法在半导体从业人员的脑海里更清晰了.在这样的大环境下, ...
- 把IDEA中新建的项目提交到Github仓库中
对于一个没有进行任何版本控制设置的idea工程,使其支持Github,设置步骤如下 到Git官网下载Git的安装包,安装好以后,Git的安装目录下的文件结构应该如下图所示 在IDEA开发工具中配置Gi ...
- webpack之傻瓜式教程及前端自动化入门
原文地址:https://www.cnblogs.com/liqiyuan/p/6246870.html 接触webpack也有挺长一段时间了,公司的项目也是一直用着webpack在打包处理,但前几天 ...
- C#中的多线程 - 高级多线程 z
原文:http://www.albahari.com/threading/part4.aspx 专题:C#中的多线程 1非阻塞同步Permalink 之前,我们描述了即使是很简单的赋值或更新一个字段也 ...
- 【Leetcode】【Medium】Flatten Binary Tree to Linked List
Given a binary tree, flatten it to a linked list in-place. For example,Given 1 / \ 2 5 / \ \ 3 4 6 T ...