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 相关文章推荐
js控制表单不能输入空格的小例子
Nov 20 Javascript
JS函数的定义与调用方法推荐
May 12 Javascript
javascript insertAfter()定义与用法示例
Jul 25 Javascript
js实现textarea限制输入字数
Feb 13 Javascript
JS实现监控微信小程序的原理
Jun 15 Javascript
JS限制输入框输入的实现代码
Jul 02 Javascript
JS实现电话号码的字母组合算法示例
Feb 26 Javascript
vue实现按需加载组件及异步组件功能
May 27 Javascript
Vue+Element实现网页版个人简历系统(推荐)
Dec 31 Javascript
vue路由缓存的几种实现方式小结
Feb 02 Javascript
JS apply用法总结和使用场景实例分析
Mar 14 Javascript
Vue实现省市区三级联动
Dec 27 Vue.js
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.MVC的模板标签系统(二)
2006/09/05 PHP
codeigniter框架批量插入数据
2014/01/09 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
JS实多级联动下拉菜单类,简单实现省市区联动菜单!
2007/05/03 Javascript
兼容多浏览器的字幕特效Marquee的通用js类
2008/07/20 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
jQuery实现可拖动的浮动层完整代码
2013/05/27 Javascript
3种Jquery限制文本框只能输入数字字母的方法
2014/12/03 Javascript
JS声明式函数与赋值式函数实例分析
2016/12/13 Javascript
Vue实现自带的过滤器实例
2017/03/09 Javascript
常见的浏览器Hack技巧整理
2017/06/29 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
2017/07/03 Javascript
jquery-file-upload 文件上传带进度条效果
2017/11/21 jQuery
详解JavaScript中关于this指向的4种情况
2019/04/18 Javascript
微信小程序页面滚动到指定位置代码实例
2019/09/07 Javascript
JS实现前端路由功能示例【原生路由】
2020/05/29 Javascript
vue 内联样式style中的background用法说明
2020/08/05 Javascript
Python cookbook(数据结构与算法)通过公共键对字典列表排序算法示例
2018/03/15 Python
Python实现判断并移除列表指定位置元素的方法
2018/04/13 Python
Python实现的直接插入排序算法示例
2018/04/29 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
python字符串分割及字符串的一些常规方法
2019/07/24 Python
django 环境变量配置过程详解
2019/08/06 Python
简单分析python的类变量、实例变量
2019/08/23 Python
python实现截取屏幕保存文件,删除N天前截图的例子
2019/08/27 Python
Python浮点数四舍五入问题的分析与解决方法
2019/11/19 Python
使用tqdm显示Python代码执行进度功能
2019/12/08 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
python实现移动木板小游戏
2020/10/09 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
办公室文秘自我鉴定
2013/09/21 职场文书
自荐信的两点禁忌
2013/10/30 职场文书
运动会通讯稿100字
2014/01/31 职场文书
商务英语求职信范文
2015/03/19 职场文书
Java GUI编程菜单组件实例详解
2022/04/07 Java/Android
MySQL创建管理KEY分区
2022/04/13 MySQL