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 相关文章推荐
window.open()详解及浏览器兼容性问题示例探讨
May 29 Javascript
jQuery下拉友情链接美化效果代码分享
Aug 26 Javascript
JavaScript预解析及相关技巧分析
Apr 21 Javascript
Javascript 获取鼠标当前的位置实现方法
Oct 27 Javascript
Bootstrap显示与隐藏简单实现代码
Mar 06 Javascript
微信小程序之发送短信倒计时功能
Aug 30 Javascript
JS实现HTML页面中动态显示当前时间完整示例
Jul 30 Javascript
Layui 设置select下拉框自动选中某项的方法
Aug 14 Javascript
浅谈Webpack核心模块tapable解析
Sep 11 Javascript
JS 音频可视化插件Wavesurfer.js的使用教程
Oct 31 Javascript
js module大战
Apr 19 Javascript
vue/cli 配置动态代理无需重启服务的方法
May 20 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
session 的生命周期是多长
2006/10/09 PHP
php站内搜索并高亮显示关键字的实现代码
2011/12/29 PHP
PHP快速推送微信模板消息
2017/04/14 PHP
为指定元素增加样式的js代码
2009/12/09 Javascript
node.js中的console.warn方法使用说明
2014/12/09 Javascript
Javascript无参数和有参数类继承问题解决方法
2015/03/02 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
Bootstrap每天必学之按钮(一)
2015/11/24 Javascript
限制只能输入数字的实现代码
2016/05/16 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
如何给element添加一个抽屉组件的方法步骤
2019/07/14 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
vuex存值与取值的实例
2019/11/06 Javascript
JavaScript中window和document用法详解
2020/07/28 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
python实现udp数据报传输的方法
2014/09/26 Python
Python中用Decorator来简化元编程的教程
2015/04/13 Python
Python多进程库multiprocessing中进程池Pool类的使用详解
2017/11/24 Python
Python实现输出某区间范围内全部素数的方法
2018/05/02 Python
Python中zipfile压缩文件模块的基本使用教程
2020/06/14 Python
PyTorch-GPU加速实例
2020/06/23 Python
Python实现一个简单的递归下降分析器
2020/08/01 Python
python tkinter的消息框模块(messagebox,simpledialog)
2020/11/07 Python
python3 os进行嵌套操作的实例讲解
2020/11/19 Python
Alba Moda瑞士网上商店:独家意大利时尚女装销售
2016/11/28 全球购物
阿拉伯书店:Jamalon
2019/07/24 全球购物
美国领先的眼镜和太阳镜在线零售商:Glasses.com
2019/08/26 全球购物
毕业生个人求职信范例分享
2013/12/17 职场文书
质检员岗位职责
2013/12/17 职场文书
制药工程专业个人求职自荐信
2014/01/25 职场文书
告诉你怎样写创业计划书
2014/01/27 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
民事授权委托书范文
2014/08/02 职场文书
群众路线学习笔记范文
2014/11/06 职场文书
护理专业自我评价
2015/03/11 职场文书
房屋产权证明书
2015/06/19 职场文书