JavaScript基本知识
数组的排序
JavaScript可以实现多维数组,对象数组等排序,语法如下
arrayobj.sort(sortfunction)
参数
arrayObj 必选项。任意 Array 对象。
sortFunction 可选项。是用来确定元素顺序的函数的名称。如果这个参数被省略,那么元素将按照 ASCII 字符顺序进行升序排列。
说明
sort 方法将 Array 对象进行适当的排序;在执行过程中并不会创建新的 Array 对象。 如果为 sortfunction 参数提供了一个函数,那么该函数必须返回下列值之一:
负值,如果所传递的第一个参数比第二个参数小。
零,如果两个参数相等。
正值,如果第一个参数比第二个参数大
不会创建新的Array对象即数组在原数组上进行排序,不生成副本。如果调用sort方法时没有使用参数,将按字母的顺序进行排序,即元素将按照 ASCII 字符顺序进行升序排列。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
- 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
- 若 a 等于 b,则返回 0。
- 若 a 大于 b,则返回一个大于 0 的值。
//数值排序 function SortNumByAsc(a ,b) { return a - b; } function SortNumByDesc(a, b) { return b - a; } var nArr = new Array(8, -6, 9, 20, -3, 5, 18, 12); nArr.sort(SortNumByAsc);
console.info(nArr); //-6, -3, 5, 8, 9, 12, 18, 20 nArr.sort(SortNumByDesc); console.info(nArr); //20, 18, 12, 9, 8, 5, -3, -6
sort(fun)接受了比较2个数值大小的函数,如果不比较数值的大小,如下
var phone = ["Apple", "Android", "WP7"]; phone.sort();
console.info(phone); //"Android", "Apple", "WP7"
数组直接调用sort后,数组按字母的顺序对数组中的元素进行排序,但如果是一个JSON数组如下
var person = []; person[0] = { name: "Irving",age: 22, hobby: "eat" }; person[1] = { name: "Jimmy", age: 27, hobby: "read" }; person[2] = { name: "Rain", age: 18, hobby: "sleep" };
现要根据age的大小对person排序,同样需要构造个对象数组排序的函数,如下
//单键排序 function SortByTagName(name) { return function (o, p) { var a, b; if (typeof o === "object" && typeof p === "object" && o && p) { a = o[name]; b = p[name]; if (a === b) { return 0; } if (typeof a === typeof b) { return a < b ? -1 : 1; } return typeof a < typeof b ? -1 : 1; } else { throw ("error"); } } }
调用下吧
var person = [{ name: "Irving", age: 22, hobby: "eat" },{ name: "Jimmy", age: 27, hobby: "read" },{ name: "Rain", age: 18, hobby: "sleep" }]; person.sort(SortByTagName("age")); //根据age排序 console.info(person[0]); //{ name="Rain", age=18, hobby="sleep"}
这里,对象排序就基本实现了,那么可以实现像MSSQL中order by age ,name 一样排序吗,即先是对age排序,如果age相同,再比较name,必须可以,改造上述函数如下
//多键排序 (def可选参数) function SortByTagName(name, def) { return function (o, p) { var a, b; if (o && p && typeof o === 'object' && typeof p === 'object') { a = o[name]; b = p[name]; if (a === b) { return typeof def === 'function' ? def(o, p) : 0; } if (typeof a === typeof b) { return a < b ? -1 : 1; } return typeof a < typeof b ? -1 : 1; } else { throw ("error"); } } }
调用
person.sort(SortByTagName("age", SortByTagName("name"))); //,SortByTagName("name") 可选参数
运用上述方法就可以随便排序了,这里介绍个JQ插件 Jquery.tinysort ,
举个列子
<ul class="xmpl" id="xnum"> <li>unrennef</li> <li>eisuqjios</li> <li>241</li> <li>20.6</li> <li>851</li> <li>65.3</li> </ul>
只需调用 即可实现对li中的数值排序
$('ul#xnum>li').tsort();
结果
<ul id="xnum" class="xmpl"> <li>20.6</li> <li>65.3</li> <li>241</li> <li>851</li> <li>eisuqjios</li> <li>unrennef</li> </ul>
API:http://tinysort.sjeiti.com/
修订记录
2012年6月21日18:48:23 开篇 数组的排序
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述