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 相关文章推荐
javascript 多种搜索引擎集成的页面实现代码
Jan 02 Javascript
javascript 事件绑定问题
Jan 01 Javascript
JS实现简单的键盘打字的效果
Apr 24 Javascript
js时钟翻牌效果实现代码分享
Jul 31 Javascript
基于jQuery和CSS3制作响应式水平时间轴附源码下载
Dec 20 Javascript
原生js实现jquery函数animate()动画效果的简单实例
Aug 21 Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 Javascript
js实现单张图片平移切换效果
Oct 11 Javascript
webpack中使用iconfont字体图标的方法
Feb 22 Javascript
详解React中setState回调函数
Jun 14 Javascript
JS获取动态添加元素的方法详解
Jul 31 Javascript
Node使用Nodemailer发送邮件的方法实现
Feb 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
DSP接收机前端设想
2021/03/02 无线电
用PHP实现验证码功能
2006/10/09 PHP
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
深入解析PHP垃圾回收机制对内存泄露的处理
2013/06/14 PHP
PHP实现HTML页面静态化的方法
2015/11/04 PHP
PHP 极验验证码实例讲解
2016/09/29 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
jquery 得到当前页面高度和宽度的两个函数
2010/02/21 Javascript
jQuery实现选项卡切换效果简单演示
2015/12/09 Javascript
jQuery ajax读取本地json文件的实例
2017/10/31 jQuery
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
d3.js 地铁轨道交通项目实战
2019/11/27 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
使用纯前端JavaScript实现Excel导入导出方法过程详解
2020/08/07 Javascript
Vue $attrs &amp; inheritAttr实现button禁用效果案例
2020/12/07 Vue.js
[00:31]DOTA2荣耀之路7:Miracle-空血无敌斩
2018/05/31 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
python根据出生年份简单计算生肖的方法
2015/03/27 Python
python实现二叉树的遍历
2017/12/11 Python
python实现单向链表详解
2018/02/08 Python
Flask模板引擎之Jinja2语法介绍
2019/06/26 Python
python实现静态web服务器
2019/09/03 Python
Python numpy多维数组实现原理详解
2020/03/10 Python
解决 jupyter notebook 回车换两行问题
2020/04/15 Python
python实现数字炸弹游戏程序
2020/07/17 Python
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
中药专业大学生医药工作求职信
2013/10/25 职场文书
教师岗位职责
2013/11/17 职场文书
2014基层党员干部学习全国两会心得体会
2014/03/17 职场文书
经典的毕业生自荐信范文
2014/04/14 职场文书
党员活动日总结
2014/05/05 职场文书
同学聚会邀请函
2015/01/30 职场文书
职位证明模板
2015/06/23 职场文书
使用Pytorch实现two-head(多输出)模型的操作
2021/05/28 Python
我收到了德劲DE1107
2022/04/05 无线电
SQL语句多表联合查询的方法示例
2022/04/18 MySQL