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的开源工具PACKER2.0.2
Nov 04 Javascript
让图片旋转任意角度及JQuery插件使用介绍
Mar 20 Javascript
jquery实现点击页面计算点击次数
Jan 23 Javascript
JS解析XML文件和XML字符串详解
Apr 17 Javascript
Bootstrap每天必学之表格
Nov 23 Javascript
javascript中Date format(js日期格式化)方法小结
Dec 17 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
js中编码函数:escape,encodeURI与encodeURIComponent详解
Mar 21 Javascript
JS得到当前时间的方法示例
Mar 24 Javascript
JS+HTML5 Canvas实现简单的写字板功能示例
Aug 30 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
Nov 28 Javascript
vue项目设置scrollTop不起作用(总结)
Dec 21 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操作Memcache实例介绍
2013/06/14 PHP
php的一个简单加密解密代码
2014/01/14 PHP
PHP遍历数组的三种方法及效率对比分析
2015/02/12 PHP
CodeIgniter表单验证方法实例详解
2016/03/03 PHP
php查询及多条件查询
2017/02/26 PHP
php多进程应用场景实例详解
2019/07/22 PHP
Extjs学习笔记之七 布局
2010/01/08 Javascript
使用javascript实现页面定时跳转总结篇
2013/09/21 Javascript
使用 Node.js 做 Function Test实现方法
2013/10/25 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
2016/08/03 Javascript
JavaScript函数节流的两种写法
2017/04/07 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
Three.js开发实现3D地图的实践过程总结
2017/11/20 Javascript
jQuery实现table表格checkbox全选的方法分析
2018/07/04 jQuery
JavaScript设计模式之构造器模式(生成器模式)定义与用法实例分析
2018/07/26 Javascript
webpack 代码分离优化快速指北
2019/05/18 Javascript
Vue项目总结之webpack常规打包优化方案
2019/06/06 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
Python实现OpenCV的安装与使用示例
2018/03/30 Python
python matplotlib绘图,修改坐标轴刻度为文字的实例
2018/05/25 Python
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
对python:print打印时加u的含义详解
2018/12/15 Python
不归路系列:Python入门之旅-一定要注意缩进!!!(推荐)
2019/04/16 Python
django rest framework vue 实现用户登录详解
2019/07/29 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
NYX Professional Makeup英国官网:美国平价专业彩妆品牌
2019/11/13 全球购物
配件采购员岗位职责
2013/12/03 职场文书
工厂总经理岗位职责
2014/02/07 职场文书
我的未来不是梦演讲稿
2014/09/02 职场文书
小学音乐课歌曲《堆雪人》教学反思
2016/02/18 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
Python深度学习之Pytorch初步使用
2021/05/20 Python
Feign调用传输文件异常的解决
2021/06/24 Java/Android