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 相关文章推荐
重载toString实现JS HashMap分析
Mar 13 Javascript
使用firebug进行调试javascript的示例
Dec 16 Javascript
Jquery获取元素的父容器对象示例代码
Feb 10 Javascript
Javascript单元测试框架QUnitjs详细介绍
May 08 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
Feb 28 Javascript
JS实现横向与竖向两个选项卡Tab联动的方法
Sep 27 Javascript
jQuery mobile在页面加载时添加加载中效果 document.ready 和window.onload执行顺序比较
Jul 14 Javascript
详解springmvc 接收json对象的两种方式
Dec 06 Javascript
js每隔两秒输出数组中的一项(实例)
May 28 Javascript
vue实现底部菜单功能
Jul 24 Javascript
微信小程序视图控件与bindtap之间的问题的解决
Apr 08 Javascript
jQuery插件simplePagination的使用方法示例
Apr 28 jQuery
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中理解print EOT分界符和echo EOT的用法区别小结
2010/02/21 PHP
PHP-FPM之Chroot执行环境详解
2015/08/03 PHP
iOS10推送通知开发教程
2016/09/19 PHP
PHP注释语法规范与命名规范详解篇
2018/01/21 PHP
使用jquery实现div的tab切换实例代码
2013/05/27 Javascript
JS保留两位小数 四舍五入函数的小例子
2013/11/20 Javascript
jquery中$.post()方法的简单实例
2014/02/04 Javascript
Jquery节点遍历next与nextAll方法使用示例
2014/07/22 Javascript
DOM事件阶段以及事件捕获与事件冒泡先后执行顺序(图文详解)
2015/08/18 Javascript
js实现跨域的多种方法
2015/12/25 Javascript
基于jQuery的Web上传插件Uploadify使用示例
2016/05/19 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
微信小程序 实战程序简易新闻的制作
2017/01/09 Javascript
jquery在启动页面时,自动加载数据的实例
2018/01/22 jQuery
基于JavaScript实现瀑布流布局
2018/08/15 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
vue store之状态管理模式的详细介绍
2019/06/13 Javascript
layui-select动态选中值的例子
2019/09/23 Javascript
Python3读取文件常用方法实例分析
2015/05/22 Python
opencv python 基于KNN的手写体识别的实例
2018/08/03 Python
python实现公司年会抽奖程序
2019/01/22 Python
python 将dicom图片转换成jpg图片的实例
2020/01/13 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
解决pycharm导入本地py文件时,模块下方出现红色波浪线的问题
2020/06/01 Python
Python3+Flask安装使用教程详解
2021/02/16 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
美国一家全面的在线零售鞋类公司:SHOEBACCA
2017/01/06 全球购物
大一学生的职业生涯规划书范文
2014/01/19 职场文书
班级学雷锋活动总结
2014/06/26 职场文书
财务部会计岗位职责
2015/02/03 职场文书
新员工辞职信范文
2015/05/12 职场文书
Python连接Postgres/Mysql/Mongo数据库基本操作大全
2021/06/29 Python
MyBatis自定义SQL拦截器示例详解
2021/10/24 Java/Android
用Python实现屏幕截图详解
2022/01/22 Python
Java实现带图形界面的聊天程序
2022/06/10 Java/Android