JS深入学习之数组对象排序操作示例


Posted in Javascript onMay 01, 2020

本文实例讲述了JS深入学习之数组对象排序功能。分享给大家供大家参考,具体如下:

JavaScript实现多维数组、对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序。

sort() 方法用于对数组的元素进行排序。语法如下:

arrayObject.sort(sortby)

返回值为对数组的引用。请注意,数组在原数组上进行排序,不生成副本。

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

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:

  • 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
  • 若 a 等于 b,则返回 0。
  • 若 a 大于 b,则返回一个大于 0 的值。
function NumAscSort(a,b)
{
 return a - b;
}
function NumDescSort(a,b)
{
 return b - a;
}
var arr = new Array( 3600, 5010, 10100, 801); 
arr.sort(NumDescSort);
alert(arr);
arr.sort(NumAscSort);
alert(arr);

sort(fun)接受了个排序规则函数,这个函数将比较2个数字的大小。而我们的对象数组排序,实际上原理也是一样的。

如果不比较数字的大小,则可以这样:

var myarray=["Apple", "Banana", "Orange"]
myarray.sort()

数组直接调用sort()后,数组按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。

对于对象数组排序,我们先写一个构造比较函数的函数:

//by函数接受一个成员名字符串做为参数
//并返回一个可以用来对包含该成员的对象数组进行排序的比较函数
var by = function(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 employees=[]
employees[0]={name:"George", age:32, retiredate:"March 12, 2014"}
employees[1]={name:"Edward", age:17, retiredate:"June 2, 2023"}
employees[2]={name:"Christine", age:58, retiredate:"December 20, 2036"}
employees[3]={name:"Sarah", age:62, retiredate:"April 30, 2020"}

直接调用函数:

employees.sort(by("age"));

到这里,对象数组排序就算基本实现了。那如何实现多个键值排序呢?意思就是先是对age排序,如果age相同,再比较name。

这时,我们可以进一步修改by函数,让其可以接受第二个参数,当主要的键值产生一个匹配的时候,另一个compare方法将被调用以决出高下。

//by函数接受一个成员名字符串和一个可选的次要比较函数做为参数
//并返回一个可以用来包含该成员的对象数组进行排序的比较函数
//当o[age] 和 p[age] 相等时,次要比较函数被用来决出高下
var by = function(name,minor){
 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 minor === 'function' ? minor(o,p):0;
   }
   if(typeof a === typeof b){
    return a < b ? -1:1;
   }
   return typeof a < typeof b ? -1 : 1;
  }else{
   thro("error");
  }
 }
}
employees.sort(by('age',by('name')));

好了,现在可以放心使用了。如果看不懂,可直接copy 这个by函数到你的应用里面,直接调用即可。

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

Javascript 相关文章推荐
让textarea控件的滚动条怎是位与最下方
Apr 20 Javascript
javascript之更有效率的字符串替换
Aug 02 Javascript
jquery连缀语法如何实现
Nov 29 Javascript
node.js中的http.response.addTrailers方法使用说明
Dec 14 Javascript
对于jQuery性能的一些优化建议
Aug 13 Javascript
jquery利用拖拽方式在图片上添加热链接
Nov 24 Javascript
JavaScript实现身份证验证代码
Feb 17 Javascript
浅析JS获取url中的参数实例代码
Jun 14 Javascript
Select2.js下拉框使用小结
Oct 24 Javascript
JavaScript模板引擎Template.js使用详解
Dec 15 Javascript
jQuery实现贪吃蛇小游戏(附源码下载)
Mar 04 Javascript
layer.prompt输入层的例子
Sep 24 Javascript
vue 输入电话号码自动按3-4-4分割功能的实现代码
Apr 30 #Javascript
浅谈Vue3.0新版API之composition-api入坑指南
Apr 30 #Javascript
JavaScript变量Dom对象的所有属性
Apr 30 #Javascript
vue项目中使用bpmn为节点添加颜色的方法
Apr 30 #Javascript
VSCode搭建Vue项目的方法
Apr 30 #Javascript
jQuery实现的解析本地 XML 文档操作示例
Apr 30 #jQuery
vue使用map代替Aarry数组循环遍历的方法
Apr 30 #Javascript
You might like
PHP 基本语法格式
2009/12/15 PHP
PHP中使用CURL伪造来路抓取页面或文件
2011/05/04 PHP
PHP中创建和编辑Excel表格的方法
2018/09/13 PHP
javascript检查日期格式的函数[比较全]
2008/10/17 Javascript
jquery $.ajax入门应用一
2008/11/19 Javascript
UserData用法总结 lanyu出品
2010/07/01 Javascript
node.js中的buffer.Buffer.isBuffer方法使用说明
2014/12/14 Javascript
学习使用bootstrap3栅格系统
2016/04/12 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
jQuery日程管理插件fullcalendar使用详解
2017/01/07 Javascript
微信小程序 仿美团分类菜单 swiper分类菜单
2017/04/12 Javascript
Node.js操作redis实现添加查询功能
2017/05/25 Javascript
javascript完美实现给定日期返回上月日期的方法
2017/06/15 Javascript
Easyui ueditor 整合解决不能编辑的问题(推荐)
2017/06/25 Javascript
nodejs项目windows下开机自启动的方法
2017/11/22 NodeJs
vue观察模式浅析
2018/09/25 Javascript
angular5 子组件监听父组件传入值的变化方法
2018/09/30 Javascript
Vue路由之JWT身份认证的实现方法
2019/08/26 Javascript
React倒计时功能实现代码——解耦通用
2020/09/18 Javascript
[02:40]DOTA2英雄基础教程 炼金术士
2013/12/23 DOTA
5种Python单例模式的实现方式
2016/01/14 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
在python 不同时区之间的差值与转换方法
2019/01/14 Python
python使用PIL和matplotlib获取图片像素点并合并解析
2019/09/10 Python
python程序输出无内容的解决方式
2020/04/09 Python
以特惠价提供在线奢侈品购物:FRMODA.com
2018/01/25 全球购物
意大利折扣和优惠券网站:Groupalia
2019/10/09 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
暑假实习求职信范文
2013/09/22 职场文书
毕业生精彩的自我评价分享
2013/10/06 职场文书
高级电工工作职责
2013/11/21 职场文书
证婚人经典证婚词
2014/01/09 职场文书
2016年综治和平安建设宣传月活动总结
2016/04/01 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
mysql中DCL常用的用户和权限控制
2022/03/31 MySQL
Vue router配置与使用分析讲解
2022/12/24 Vue.js