js数组排序,支持正反排序以及多维度排序

工作中遇到js数组排序问题,数组中存储的都是对象,于是就百度了下,利用别人的代码进行修改,最终完成可以倒序、反序,可以进行多维度排序的功能
源码如下:

/**
* js数组排序 支持数字和字符串
* @param params
* @param arrObj   obj     必填  数组对象
* @param keyName  string  必填  要排序的属性名称
* @param type     int     选填  默认type:0 正顺  type:1反顺
*/
function arrItemSort(arrObj,keyName,type) {
  //这里如果 直接等于arrObj,相当于只是对对象的引用,改变排序会同时影响原有对象的排序,而通过arrObj.slice(0),
  //表示把对象复制给另一个对象,两者间互不影响
  var tempArrObj = arrObj.slice(0);
  var compare = function (keyName,type) {
      return function (obj1, obj2) {
          var val1 = obj1[keyName];
          var val2 = obj2[keyName];
          if (!isNaN(Number(val1)) && !isNaN(Number(val2))) {
              val1 = Number(val1);
              val2 = Number(val2);
              }
              //如果值为空的,放在最后
              if (val1 == null && val2 == null) {
              return 0;
          } else if (val1 == null && val2!= null ) {
              return (type==1 ? -1 : 1);
          } else if (val2 == null && val1!= null ) {
              return (type==1 ? 1 : -1);
          }
              //排序
          if (val1 < val2) {
              return (type==1 ? 1 : -1);
          } else if (val1 > val2) {
              return (type==1 ? -1 : 1);;
          } else {
              return 0;
          }
      }
  }
  return tempArrObj.sort(compare(keyName,type));
}

使用示例:

var temp = [
  {"name":"zjf","score":50,"age":10},
  {"name":"lyy","score":90,"age":5},
  {"name":"zzx","score":90,"age":12}
];
//根据age排序
var temp1 = arrItemSort(temp,"age",1);
console.log(temp1);

//先按年龄排序,再按分数排序
var temp2 = arrItemSort(arrItemSort(temp,"age",1),"score",1);
console.log(temp2);

来源:jsfun.cn

原文地址:https://www.cnblogs.com/jsfuns/p/8541579.html

时间: 2024-10-07 20:34:09

js数组排序,支持正反排序以及多维度排序的相关文章

js数组排序 reverse()和sort()方法的使用

WEB前端|js数组排序reverse()和sort()方法的使用,数组中已经存在两个可以直接用来重排序的方法:reverse()和sort(). reverse()方法会对反转数组项的顺序. var values = [1, 2, 3, 4, 5]; values.reverse(); alert(values);  //5,4,3,2,1 这里数组的初始值及顺序是1.2.3.4.5.而调用数组的reverse()方法后,其值的顺序变成了5.4.3.2.1.这个方法的作用相当只管明了,但不够灵

JS不支持正则中的负向零宽断言

今天在项目中用到了正则表达式,并且需要用负向零宽断言 (?<=exp) 进行筛选,结果运行时报 Invalid group 错,一开始以为是自己很久没用表达式写错了,查阅了一下正则语法后发现并没有写错. 到网上一搜才发现,JS不支持负向的 (?<=exp) 和 (?<!exp),只支持正向的(?=exp) 和 (?!exp).

js 数组排序要注意的问题,返回的值最好为 -1, 0, 1之间的值

var test10Elements = [7, 6, 5, 4, 3, 2, 1, 0, 8, 9]; var comparefn = function (x, y) { return x - y; }; test10Elements.sort(comparefn); var comparefn2 = function (x, y) { return x > y; }; test10Elements.sort(comparefn2); http://w3help.org/zh-cn/cause

看到有网友说Node.js是支持多线程的,我在这里解释一下

Node.js确实有一个扩展,叫tagg,可以实现多线程.但实际上是这样的,它的这个多线程只是一个线程池,去执行一部分计算的任务. EventLoop和IO的处理部分始终是单线程的,在任务线程中不能调用异步接口,只能计算或者执行阻塞IO. 除了tagg之外,Node.js还有child_process,cluster等扩展可以实现多进程.但这里的多进程也不知真正意义上的子进程.而是node的另外一个实例.它无法继承使用父进程的任何资源. 注:有好多同学说,单线程EventLoop足够用了.各位可

go语言的排序、结构体排序

原文:https://studygolang.com/articles/1598 晚上准备动手写点 go 的程序的时候,想起 go 如何排序的问题.排序 sort 是个基本的操作,当然搜索 search 也是.c 提供一个 qsort 和 bsearch,一个快排一个二分查找,不过是使用起来都不方便: c++ 中的 sort 貌似很不错,因为 c++ 支持泛型(或是说模板),所以很多东西使用起来很方便.go 是通过 sort 包提供排序和搜索,因为 go 暂时不支持泛型(将来也不好说支不支持),

排序算法之希尔排序

文章转载自http://www.cnblogs.com/chengxiao/ 希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法.希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一.本文会以图解的方式详细介绍希尔排序的基本思想及其代码实现. 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序:随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组

排序的概念(选择排序1)

                                     排序(比较与交换) 排序的稳定性:     排序之前,R[i]在R[j]前面,排序后,R[i]还在R[j]前面,则这个排序方法是稳定的.否则这个排序  方法是不稳定的.  外排序:----依赖--->内排序      待排序的数据元素数量很大,整个序列的排序过程不可能在内存中完成.  内排序:      整个排序过程不需要访问外存便能完成.                                       排序的

HashMap按键排序和按值排序

一.简单介绍Map 在讲解Map排序之前,我们先来稍微了解下map.map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等.其中这四者的区别如下(简单介绍): HashMap:我们最常用的Map,它根据key的HashCode 值来存储数据,根据key可以直接获取它的Value,同时它具有很快的访问速度.HashMap最多只允许一条记录的key值为Null(多条会覆盖);允许多条记录的Value为 Null.非同步的. T

C++ STL中Map的按Key排序和按Value排序

原文  http://blog.csdn.net/iicy266/article/details/11906189 map是用来存放<key, value>键值对的数据结构,可以很方便快速的根据key查到相应的value.假如存储学生和其成绩(假定不存在重名,当然可以对重名加以区分),我们用map来进行存储就是个不错的选择. 我们这样定义,map<string, int>,其中学生姓名用string类型,作为Key:该学生的成绩用int类型,作为value.这样一来,我们可以根据学